在Haskell中封装数据定义

时间:2012-05-11 14:55:15

标签: haskell types syntax

我正在尝试使用其他数据类型定义数据类型:

data A = Something String | SomethingElse Int

data B = Another B | YetAnother A

data C = A | B

x :: [ C ]
x = [ YetAnother (SomethingElse 0), Something "Hello World" ]

但是这给了我一个错误,说我在期待B型时不能有A型。为什么会这样?

3 个答案:

答案 0 :(得分:7)

您缺少C的数据构造函数。

data A = Something String
       | SomethingElse Int

data B = Another    B
       | YetAnother A

data C = C0 A
       | C1 B

x :: [ C ]
x = [ C1 (YetAnother (SomethingElse 0))
    , C0 (Something "Hello World")
     ]

答案 1 :(得分:4)

A中的Bdata C = A | B是新数据构造函数的声明,而不是对现有类型AB的引用。 (构造函数在data声明中不是可选的。)

答案 2 :(得分:0)

Haskell没有真正的“union”类型,Haskell中的联合必须用构造函数标记。 (见Wikipedia > Tagged union)。

Either是Haskell中的通用标记联合类型,其中数据被标记为LeftRight

data Either a b = Left a | Right b