1

我正在尝试使用其他数据类型来定义数据类型,如下所示:

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 型。这是为什么呢?

4

3 回答 3

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")
     ]
于 2012-05-11T14:57:58.623 回答
4

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

于 2012-05-11T14:58:11.327 回答
0

Haskell 没有真正的“联合”类型,Haskell 中的联合必须使用构造函数进行标记。(见维基百科>标记联合)。

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

data Either a b = Left a | Right b
于 2012-05-15T23:47:14.700 回答