OCaml变体类型

4

无论我读什么教程或手册,OCaml类型总是让我感到困惑。我需要定义一个名为test的类型,其中包含以下形式:

一个类型为('a, 'b) test,它具有以下一种形式之一: Empty,T t,N n,Seq [x1...xn]

我知道如何做前三个,但我绝对不知道如何定义最后一个形式。这是我的代码:

type ('nonterm, 'term) test =
   | Empty
   | T of 'term
   | N of 'nonterm
   | ????

对于seq,我需要匹配子表达式x1到xn的实例。如果x=0,则为空。有人能帮忙吗?提前致谢。


3
Atticus - 我看到你是一个新用户,首先欢迎来到Stackoverflow!我注意到你还没有对你所提出的问题进行投票或接受任何答案。如果你还没有阅读过常见问题解答:http://stackoverflow.com/faq,那么你应该去阅读一下。基本上,如果你喜欢某个答案,你应该投票支持,如果它充分回答了你的问题,你应该接受它。 - Niki Yoshiuchi
2个回答

11

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

type ('nonterm, 'term) test =
  | Empty
  | T of 'term
  | N of 'nonterm
  | Seq of ('nonterm, 'term) test list

当然,列表可以为空。


谢谢Michael!如果可能的话,您能否解释一下最后一行是什么意思?(我对OCaml非常陌生,这将非常有帮助)。是的,Seq的子表达式也是测试,但我只是好奇如果它们不是测试会发生什么? - Atticus

7
这是对你在Michael E的评论的回答:
OCaml变体由带有可选参数的构造函数组成。在Michael的答案中,构造函数是: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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接