无论我阅读什么教程/手册,OCaml类型总是让我很困惑。我需要定义一个类型,比方说test,它确实包含以下形式:
具有以下形式之一的类型('a,'b)测试: 空,T t,N n,Seq [x1 ... xn]
我知道如何做前三个,但我完全不知道如何定义最后一个表格。这就是我所拥有的:
type ('nonterm, 'term) test =
| Empty
| T of 'term
| N of 'nonterm
| ????
对于seq,我需要匹配子表达式x1到xn的实例。如果x = 0,那么这是空的。有人可以帮帮我吗?提前谢谢。
答案 0 :(得分:11)
Seq
的子表达式是否也会测试?如果是这样,您可以使用列表:
type ('nonterm, 'term) test =
| Empty
| T of 'term
| N of 'nonterm
| Seq of ('nonterm, 'term) test list
列表当然可以是空的。
答案 1 :(得分:7)
这是对你对Michael E的评论的答案:
OCaml变体由带有可选参数的构造函数组成。对于迈克尔的答案,构造函数是:Empty
,T
,N
和Seq
。 Empty
不带参数,T
采用名为'term
的泛型类型,N
采用名为'nonterm
的泛型类型(我将Seq
在一秒钟内)。变体的类型为('nonterm, 'term) test
。假设您需要('nonterm, 'term) test
类型的元素列表:
# [Empty; Empty];;
- : ('a, 'b) test list = [Empty; Empty]
您会注意到该类型为('a, 'b) test list
。 (OCaml将nonterm
替换为a
,将term
替换为b
,但您无需过多担心。
现在我们可以看到| Seq of ('nonterm, 'term) test list
是一个名为Seq
的构造函数,它将类型('nonterm, 'term) test
的元素列表作为参数。现在我们可以这样做:
# Seq [Empty;Empty];;
- : ('a, 'b) test = Seq [Empty; Empty]