如何在Haskell中创建不同类型的对象列表?

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:CodeValue.这有点类似于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].


Tho*_*son 7

当然需要一些术语.在你的代码的令牌Code,并ListObject都是"数据类型",并在一个命名空间.

第二个概念是"构造函数",用于构造数据类型的特定实例的命令.构造住在一个单独的命名空间-在这些代码包括令牌Code_A,Code_B,Code_CCode,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带有两个构造函数(CodeObjectIntObject)的数据类型,每个构造函数都采用单个数据类型(CodeInt分别)来创建该ListObject类型的实例.

如果你明白就停在这里! 对于构造函数使用函数类型签名,有些人会更容易(并且有些困难).以上ListObject使用这种表示法看起来像:

data ListObject where
        CodeObject :: Code -> ListObject
        IntObject  :: Int -> ListObject
Run Code Online (Sandbox Code Playgroud)

这清楚地表明CodeObject某种功能是接受Code并返回一个ListObject.类似的故事IntObject