【发布时间】:2015-06-21 16:34:39
【问题描述】:
我正在尝试创建一对相互递归的数据类型来表示 OCaml 中的红黑树,用于家庭作业。但是,我对 OCaml 语言非常不熟悉,所以我遇到了一些语法问题。
这是我目前的想法:
type 'a red_black_tree =
| RedNode of 'a * ( 'a black_node * 'a black_node )
| BlackNode of 'a black_node
and 'a black_node =
| TwoRedNodes of 'a * ( 'a RedNode * 'a RedNode )
| TwoBlackNodes of 'a * ( 'a black_node * 'a black_node )
| BlackLeaf;;
当我将它输入到 ocaml 时,它给了我:
utop # type 'a red_black_tree =
| RedNode of 'a * ( 'a black_node * 'a black_node )
| BlackNode of 'a black_node
and 'a black_node =
| TwoRedNodes of 'a * ( 'a RedNode * 'a RedNode )
| TwoBlackNodes of 'a * ( 'a black_node * 'a black_node )
| BlackLeaf;;
Error: Syntax error
您不能从子类型中引用类型的子值吗?不是在寻找问题的实际答案,只是语法说明。
更新
我在初次尝试后得到了这个,但教授说它不是一对相互递归的数据类型:
type 'a red_black_tree =
| RedNode of 'a red_node
| BlackNode of 'a black_node
and 'a red_node =
| RedTree of 'a * ( 'a black_node * 'a black_node )
and 'a black_node =
| TwoRedNodes of 'a * ( 'a red_node * 'a red_node )
| TwoBlackNodes of 'a * ( 'a black_node * 'a black_node )
| BlackLeaf;;
更新 2
问题 3 红黑树是一种有时用于组织数值数据的树。它有两种类型的节点,黑色节点和红色节点。红色节点总是有一个数据和两个孩子,每个孩子都是一个黑色节点。黑色节点可能有: 1)一个数据和两个红色节点的子节点; 2)一个数据和两个子节点,即黑色节点;或 3) 没有数据也没有子节点(即叶节点)。 (这不是对红黑树的精确描述,但适用于本练习。)
编写一对相互递归的 OCaml 数据类型,表示红黑树中的红色节点和黑色节点。数据应该可以有任何类型,也就是说,你的类型应该是存储在树中的数据类型中的多态。
【问题讨论】:
标签: recursion ocaml algebraic-data-types