2011-01-24 70 views
4

无论我读过什么教程/手册,OCaml类型总是让我感到困惑。我需要定义一种类型,假设测试,它包含以下形式:Ocaml变体类型

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

我知道如何做第3个,但我完全不知道如何定义最后一个表格。这是我的:

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

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

+2

Atticus - 我看到你是一个新用户,所以第一:欢迎来到Stackoverflow!我注意到,你还没有投票或接受任何答案,你到目前为止问的问题。如果你还没有,你应该阅读常见问题:http://stackoverflow.com/faq - 基本上如果你喜欢一个答案,你应该投票,如果它充分回答你的问题,那么你应该接受它。 – 2011-01-24 19:00:30

回答

10

Seq的子表达式是否也在测试?如果是这样,你可以使用一个列表:

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

列表当然可以是空的。

+0

谢谢Michael!如果可能的话,您是否也可以解释一下最后一行的含义? (我对OCaml非常陌生,它会非常有帮助)。是的,Seq的子表达式也是测试,但我只是好奇如果它们不是,会发生什么? – Atticus 2011-01-24 02:06:29

6

这是一个答案,以迈克尔·您的评论:

OCaml的变体由具有可选参数的构造函数。在迈克尔的答案中,构造函数是:Empty,T,NSeqEmpty不需要参数,T采用一种称为'term的通用类型,而N采用称为'nonterm的通用类型(我将在一秒钟内获得Seq)。该变体的类型为('nonterm, 'term) test。比方说,你想('nonterm, 'term) test类型的元素列表:

# [Empty; Empty];; 
- : ('a, 'b) test list = [Empty; Empty] 

你会发现,类型是('a, 'b) test list。 (OCaml用atermb代替nonterm,但您不必太担心)。

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

# Seq [Empty;Empty];; 
- : ('a, 'b) test = Seq [Empty; Empty]