如何定义代数数据类型

时间:2011-10-27 17:13:12

标签: haskell

对于另一个问题道歉,我想我会在这里重新说出我原来的问题,因为这可能是一件非常简单的事情:

如果我有一种我想要创建的语言,就像这样:

A B <something> C

这只意味着输入如下:A B .... C有效。

相比之下,B A .....将无效。

有没有简单的方法来定义构造函数,例如'B'必须始终出现在'A'之后?我只见过A | B类型的构造函数“A或B”

1 个答案:

答案 0 :(得分:1)

喜欢这样吗?

-- file Temp.hs
module Temp where
data C = C1 | C2 | C3
data B = B1 Int | B2 String | B3
data A a = MkA B a C

这与ghc -c Temp.hs合并得很好 - 您无法在data中使用ghci语句,这是ghci的限制之一。

所以,我在这里定义了三种数据类型:

  • C,它有三个不带参数的构造函数:C1C2C3。其中每个都是C
  • 类型的值
  • B,它有构造函数
    • B1包含Int值,因此B1 3B1 544B类型的值
    • B2包含String值,因此B2 "hello"B2 "world"是B类值
    • B3是一个简单的无参数构造函数,因此B3是类型B的值。
  • A a这是一种多态数据类型 - 对于每种类型aA a也是一种数据类型。它有一个构造函数MkA,它接受​​
    • 类型B的值
    • a类型的值
    • 和类型C的值
    并创建类型为A a的值。所以,例如
    • MkA B3 True C1的类型为A Bool
    • MkA (B1 30) "Foo" C3的类型为A String