Han*_*ock 0 generics haskell list
我有这两个Haskell数据类型:
data Code
= Code_A | Code_B | Code C
deriving (Eq,Show)
data ListObject = Code | Int
Run Code Online (Sandbox Code Playgroud)
我需要制作一个包含的列表ListObjects.这是整数值和代码([1,2, Code_A, 3]).我知道它应该是可能的,但我无法弄清楚它的语法.Haskell可以做一些整洁的东西,但它的语法很糟糕.一些帮助将不胜感激.
Rob*_*oli 12
怎么样:
data Code
= Code_A | Code_B | Code_C
deriving (Eq,Show)
data ListObject = ListCode Code | Value Int
objects :: [ListObject]
objects = [ListCode Code_A, Value 0]
Run Code Online (Sandbox Code Playgroud)
应该这样做.
sep*_*p2k 10
你定义的方式ListObject恰好有两个类型的值ListObject:Code和Value.这有点类似于enum ListObject {Code, Int}C语言.Code类型的costructor ListObject实际上与类型没有任何关系Code(同样适用Int).
所以你定义它的方式,ListObjects 的列表看起来像这样:[Int, Code, Code, Int].当然那不是很有用.
您可能想要做的是这样的:data ListObject = CodeObject Code | IntObject Int,它表示"ListObject是包含Int的IntObject,或包含代码的CodeObject".
根据该定义,您的列表可能看起来像[IntObject 42, Code Code_A, IntObject 23].
当然需要一些术语.在你的代码的令牌Code,并ListObject都是"数据类型",并在一个命名空间.
第二个概念是"构造函数",用于构造数据类型的特定实例的命令.构造住在一个单独的命名空间-在这些代码包括令牌Code_A,Code_B,Code_C和Code,Int.
这是你的困惑.你认为你曾经说过你想要一种名为ListObject包含Code或者数据类型的数据类型Int.相反,你已经定义ListObject了两个名为Code和的Null(零内容)构造函数Int.
现在我们得到解决方案,罗伯特在他的回答中跳了出来:
data ListObject = CodeObject Code | IntObject Int
Run Code Online (Sandbox Code Playgroud)
注意语法:
data [DataTypeName] = [ConstructorName] [Component Data Type 1] | ...
Run Code Online (Sandbox Code Playgroud)
用英语编写上面的代码,我们有一个ListObject带有两个构造函数(CodeObject和IntObject)的数据类型,每个构造函数都采用单个数据类型(Code和Int分别)来创建该ListObject类型的实例.
如果你明白就停在这里! 对于构造函数使用函数类型签名,有些人会更容易(并且有些困难).以上ListObject使用这种表示法看起来像:
data ListObject where
CodeObject :: Code -> ListObject
IntObject :: Int -> ListObject
Run Code Online (Sandbox Code Playgroud)
这清楚地表明CodeObject某种功能是接受Code并返回一个ListObject.类似的故事IntObject