我正在尝试使用其他数据类型定义数据类型:
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型。为什么会这样?
答案 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
中的B
和data C = A | B
是新数据构造函数的声明,而不是对现有类型A
和B
的引用。 (构造函数在data
声明中不是可选的。)
答案 2 :(得分:0)
Haskell没有真正的“union”类型,Haskell中的联合必须用构造函数标记。 (见Wikipedia > Tagged union)。
Either是Haskell中的通用标记联合类型,其中数据被标记为Left
或Right
。
data Either a b = Left a | Right b