Ocaml变体类型

时间:2011-01-24 01:15:17

标签: ocaml

无论我阅读什么教程/手册,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,那么这是空的。有人可以帮帮我吗?提前谢谢。

2 个答案:

答案 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变体由带有可选参数的构造函数组成。对于迈克尔的答案,构造函数是:EmptyTNSeqEmpty不带参数,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]