我正在尝试从OCAML中的int列表创建一个树。我是函数式编程的新手。到目前为止,这是我的功能:
let rec theList (lst : int list) =
match lst with
| [] -> Empty
| h::t -> insert Empty h::theList List.tl lst
当insert是一个创建节点并将h的值放在节点中的函数时。我尝试遍历列表,但在我使用参数调用insert之后的冒号我得到错误:“错误:变体类型bstTree没有构造函数::”因为这是我定义的类型:
type bstTree = Empty | bstTree * Node of int * bstTree
从广义上讲,我要做的就是通过列表进行递归并在列表中的每个int上调用insert。我已经在这方面工作了一段时间,所以感谢任何帮助,谢谢。
答案 0 :(得分:0)
您的代码存在许多问题(如果刚刚开始,可以预料到。)
首先,您的类型定义在语法上无效:
# type bstTree = Empty | bstTree * Node of int * bstTree;;
Error: Syntax error
你很可能想要更像这样的东西:
type bstTree = Empty | Node of bstTree * int * bstTree
其次,您正在定义名为theList
的函数,但在函数内部调用名为fromList
的函数。我怀疑这些应该是同一个名字。
第三,无需拨打List.tl
,因为您已经在名称t
下匹配了列表的尾部。
第四,你的表达式中需要更多括号。一个好的起点可能是这样的:
insert Empty h (fromList List.tl lst)
正如编译器指出的那样,您无法将构造函数::
应用于类型bstTree
的值。 ::
构造函数仅适用于从元素和另一个(较小的)列表构建列表。