type'a tree =空| 'a *'树*'树的节点;;如何理解类型定义?
它是一个类型定义,其中a
是一种类型的参数,tree
是类型的名字吗?
在Node of
,是Node
一个内置类型的OCaml? of
是什么意思?
谢谢。
type'a tree =空| 'a *'树*'树的节点;;如何理解类型定义?
它是一个类型定义,其中a
是一种类型的参数,tree
是类型的名字吗?
在Node of
,是Node
一个内置类型的OCaml? of
是什么意思?
谢谢。
是'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
Shape
和Rectangle
是标签(再次构造函数),我只是做了,让我来构建shape
类型的值(在这种情况下,我选择了有Shape
只取一个参数,因为只有长度需要指定一个正方形,而Rectangle
需要长度和宽度)。从来没有一种类型的Shape
或Rectangle
,但事情可以有一种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来获取更多细节。
该类型定义:
type 'a tree = Empty | Node of 'a * 'a tree * 'a tree;;
以下是大致的“事实” OCaml的编译器知道关于此基础上:
tree
是一元型构造。这意味着对于任何类型的t
,t tree
也是一种类型(例如:int tree
)。Empty
是'a tree
的0元构造函数。这意味着Empty
对于任何t
都有类型t tree
。Node
是3元构造函数。这里,这意味着如果a
具有类型t
,b
具有类型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) -> ...
)。
谢谢。 'Node'是一个类型构造函数,即一个构造类型的构造函数? 'Node'是否需要定义? – Tim
@Tim是它是一个类型构造函数,因此不需要定义实现 – badcook
为什么不需要定义'Node'?如果'Node'没有定义,那么''树'是一个未定义的类型? – Tim