对于另一个问题道歉,我想我会在这里重新说出我原来的问题,因为这可能是一件非常简单的事情:
如果我有一种我想要创建的语言,就像这样:
A B <something> C
这只意味着输入如下:A B .... C有效。
相比之下,B A .....将无效。
有没有简单的方法来定义构造函数,例如'B'必须始终出现在'A'之后?我只见过A | B类型的构造函数“A或B”
答案 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
,它有三个不带参数的构造函数:C1
,C2
和C3
。其中每个都是C
B
,它有构造函数
B1
包含Int
值,因此B1 3
和B1 544
是B
类型的值B2
包含String
值,因此B2 "hello"
和B2 "world"
是B类值B3
是一个简单的无参数构造函数,因此B3
是类型B的值。A a
这是一种多态数据类型 - 对于每种类型a
,A a
也是一种数据类型。它有一个构造函数MkA
,它接受B
的值
a
类型的值
C
的值
A a
的值。所以,例如
MkA B3 True C1
的类型为A Bool
MkA (B1 30) "Foo" C3
的类型为A String