gpt4 book ai didi

Haskell 的代数数据类型 : "pseudo-extend"

转载 作者:行者123 更新时间:2023-12-03 14:27:35 28 4
gpt4 key购买 nike

我正在学习 Haskell 中的代数 DT。我想做的是创建一个新的 ADT 来“扩展”现有的 ADT。我找不到如何表达我想要的东西,有人可以建议替代模式或建议解决方案。我希望它们是不同的类型,但复制和粘贴只是接缝,就像一个愚蠢的解决方案。下面的代码最能描述我正在寻找的东西。

data Power =
Abkhazia |
-- A whole bunch of World powers and semi-powers
Transnistria
deriving (Eq, Show)

data Country =
--Everything in Power |
Netural |
Water
deriving (Eq, Show)

编辑:我认为需要澄清一下……我希望能够做到这一点(在 ghci 中)
let a = Abkhazia :: Country

并不是
let a = Power Abkhazia :: Country

最佳答案

您需要将它们表示为一棵树:

  data Power
= Abkhazia
| Transnistria
deriving (Eq, Show)

data Country
= Powers Power -- holds values of type `Power`
| Netural -- extended with other values.
| Water
deriving (Eq, Show)

编辑:您对问题的扩展使这变得更简单:Country 和 Power 类型都与“国家”有一些共同的行为。这建议您使用 Haskell 的开放、可扩展类型类特性来为数据类型提供常见行为。例如。
  data Power = Abkhazia | Transistria 

data Countries = Neutral | Water

然后,Power 和 Country 共享的事物的类型类:
  class Countrylike a where
landarea :: a -> Int -- and other things country-like entities share

instance Countrylike Power where
landarea Abkhazia = 10
landarea Transistria = 20

instance Countrylike Countries where
landarea Neutral = 50
landarea Water = 0

那么你可以使用 landarea无论是权力还是国家。您可以在 future 通过添加更多实例将其扩展到新类型。

关于Haskell 的代数数据类型 : "pseudo-extend",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11073595/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com