Ocaml变体类型

Att*_*cus 4 ocaml

无论我阅读什么教程/手册,OCaml类型总是让我很困惑.我需要定义一个类型,比方说test,它确实包含以下形式:

具有以下形式之一的类型('a,'b)测试:Empty,T t,N n,Seq [x1 ... xn]

我知道如何做前三个,但我完全不知道如何定义最后一个表格.这就是我所拥有的:

type ('nonterm, 'term) test =
   | Empty
   | T of 'term
   | N of 'nonterm
   | ????
Run Code Online (Sandbox Code Playgroud)

对于seq,我需要匹配子表达式x1到xn的实例.如果x = 0,那么这是空的.有人可以帮帮我吗?提前致谢.

Mic*_*and 11

子表达式Seq也是测试吗?如果是这样,您可以使用列表:

type ('nonterm, 'term) test =
  | Empty
  | T of 'term
  | N of 'nonterm
  | Seq of ('nonterm, 'term) test list
Run Code Online (Sandbox Code Playgroud)

列表当然可以是空的.


Nik*_*chi 7

这是对Michael E的评论的答案:

OCaml变体由具有可选参数的构造函数组成.在迈克尔的回答的情况下,构造函数是:Empty,T,NSeq. Empty不接受任何参数,T采用一个被调用的泛型类型,'termN采用一种称为泛型的类型'nonterm(我将Seq在一秒钟内完成).变体具有类型('nonterm, 'term) test.假设你想要一个类型的元素列表('nonterm, 'term) test:

# [Empty; Empty];;
- : ('a, 'b) test list = [Empty; Empty] 
Run Code Online (Sandbox Code Playgroud)

你会注意到类型是('a, 'b) test list.(OCaml的替换nontermatermb,但你并不需要担心太多).

现在我们可以看到这| Seq of ('nonterm, 'term) test list是一个被调用的构造函数Seq,它将类型元素列表('nonterm, 'term) test作为参数.现在我们可以这样做:

# Seq [Empty;Empty];;
- : ('a, 'b) test = Seq [Empty; Empty]
Run Code Online (Sandbox Code Playgroud)