2017-09-03 146 views
1

type'a tree =空| 'a *'树*'树的节点;;如何理解类型定义?

它是一个类型定义,其中a是一种类型的参数,tree是类型的名字吗?

Node of,是Node一个内置类型的OCaml? of是什么意思?

谢谢。

回答

4

'a是一个类型参数,tree是一个类型名称(这些通常在OCaml中称为变体)。这与大多数其他语言的顺序相反。 Node是一个构造函数(在OCaml中称为标签),而of仅仅是OCaml中的一个关键字,用于指定构造函数参数的类型。 Node不是一个内置的OCaml类型(它甚至不是一个类型,而是我所说的构造函数)。

因此Node (5, Empty, Node (6, Empty, Empty))int tree类型的东西(类似于Java中的Tree<Int>)。

如果你从一个简单的变体开始,它可能会更有意义。

type shape = Square of int | Rectangle of int * int 

ShapeRectangle是标签(再次构造函数),我只是做了,让我来构建shape类型的值(在这种情况下,我选择了有Shape只取一个参数,因为只有长度需要指定一个正方形,而Rectangle需要长度和宽度)。从来没有一种类型的ShapeRectangle,但事情可以有一种shape。读取在英国该行

的一种方式是“我已经定义了一个称为shape类型。甲shape是一个单一的整数的Square,或两个整数的Rectangle”。

现在也许由于某种原因,我也想标签我的形状。

type 'label labelledshape = LabelledSquare of 'label * int | LabelledRectangle of 'label * int * int 

引证'区别在于label不是类型(如int),相反却是可变的。这让我写类似LabelledSquare ("a label for a square", 5)这类型的string labelledshape

注意的是,虽然这允许多态性,这些都不是所谓的OCaml中“多态性变异”。我不会在此讨论这个问题,而只是推荐查看OCaml文档或浏览Stack Overflow来获取更多细节。

+0

谢谢。 'Node'是一个类型构造函数,即一个构造类型的构造函数? 'Node'是否需要定义? – Tim

+0

@Tim是它是一个类型构造函数,因此不需要定义实现 – badcook

+0

为什么不需要定义'Node'?如果'Node'没有定义,那么''树'是一个未定义的类型? – Tim

1

该类型定义:

type 'a tree = Empty | Node of 'a * 'a tree * 'a tree;; 

以下是大致的“事实” OCaml的编译器知道关于此基础上:

  • tree是一元型构造。这意味着对于任何类型的tt tree也是一种类型(例如:int tree)。
  • Empty'a tree的0元构造函数。这意味着Empty对于任何t都有类型t tree
  • Node是3元构造函数。这里,这意味着如果a具有类型tb具有类型t tree,和c has type吨树, then节点(A,B,C)has type吨树(note: that's the same t`)
  • 那些是具有类型的值的只有两种方式t tree。这意味着您可以使用模式匹配(match ... with | Empty -> ... | Node (a, b, c) -> ...)。