我有两种类型:
type 'a llist =
LNil
| LCons of 'a * (unit -> 'a llist);;
type 'a lBT =
LEmpty
| LNode of 'a * (unit -> 'a lBT) * (unit -> 'a lBT);;
我需要编写获取惰性列表的函数并返回惰性BST。 我目前有两个函数,第一个(添加,获取元素和树,并返回带有此元素的树)似乎没问题,但是第二个(通过列表迭代并创建一个新树,添加列表中的所有元素)我得到错误。对我来说它看起来不错,但我可能只是不明白的东西。我不知道是什么。
let rec add (elem, tree) =
match (elem, tree) with
(None, _) -> LEmpty
| (x, LEmpty) -> LNode (x, (function() -> add (None, LEmpty)), (function() -> add (None, LEmpty)))
| (x, LNode (y, l, r)) when x < y -> LNode(y, (function () -> add (x, l())), r)
| (x, LNode (y, l, r)) -> LNode(y, l, (function () -> add (x, r())));;
let toLBST listal =
let rec toLBST_rec listal tree =
match listal with
LNil -> tree
| LCons(x, xs) -> toLBST_rec (xs()) add(x, tree)
in toLBST_rec (listal, LEmpty);;
我明白了:
Characters 141-145:
| LCons(x, xs) -> toLBST_rec (xs()) add(x, tree)
^^^^
Error: This expression has type 'a option * 'a option lBT -> 'a option lBT
but an expression was expected of type 'a option lBT
我不知道该怎么做才能正常工作。我尝试了一些事情,但每次我都会遇到一些错误。
答案 0 :(得分:2)
以下是您在代码中犯的各种错误:
(None, _) -> LEmpty
这是错误的,elem
没有理由成为选项类型。在LEmpty
的情况下,只需使用LEmpty
来定义返回的延迟树的子项。
| LCons(x, xs) -> toLBST_rec (xs()) add(x, tree)
你遗忘了add(x, tree)
周围的括号。
in toLBST_rec (listal, LEmpty);;
您定义了toLBST_rec
以获取两个参数,现在您只传递一个错误类型的参数(一对列表和一个树,而参数只需要一个列表)。您似乎对OCaml中多参数(currified)函数的语法感到困惑。你应该在函数声明和调用中避免(.. , ..)
,而是定义let rec add elem tree =
等。