在Haskell中使用数据类型

Let*_*thi 6 haskell typing subtyping

我已经开始这是一个新问题,因为它成为我上一个问题的后续问题.

如果我有两个由类似构造函数组成的数据类型:

data A = X | Y | Z
data B = X | Y
Run Code Online (Sandbox Code Playgroud)

有没有办法我可以用这种方式表示:

data A = C | Z
data B = C

data C = X | Y
Run Code Online (Sandbox Code Playgroud)

如果你能看到我在做什么 - 我正在尝试将X |分组 Y为一种数据类型,然后可由多种其他数据类型使用.我似乎无法让编译器允许这个,或者如果它,我不能模式匹配X或Y,只有C ??

我收到多次声明C的错误消息.

我以为我可以使用类型,但它们不允许多种类型.

编辑

即使我声明了很长的路(如下所示),它仍然无法编译,并且说X和Y有多个声明:

data A = X | Y | Z
data B = X | Y
Run Code Online (Sandbox Code Playgroud)

sep*_*p2k 13

不仅你不能做到这一点,你也不能做你的第一选择-即你不能有两个具有构造评为同一模块中的两种类型XY.

如果你能做到这一点,又该的型XBE - C,A还是B?最明显的答案是C,但是你将无法在需要a A或者a 的上下文中使用它B(注意Haskell没有子类型),这样就会破坏整个构造的目的.

你能做的最好的事情是将C包装在A和B的构造函数中,即:

data A = AC C | Z
data B = BC C
data C = X | Y
Run Code Online (Sandbox Code Playgroud)

然后,你可以换一个C与任一ACBC构造函数来创建类型的值AB分别.

  • @Dan是的.在我的例子中,你要编写`AC X`来创建一个类型为'A`和`BC X`的值来创建类型`B`的值.`X`本身不能有两种不同的类型. (2认同)