OCaml,懒惰的列表变成了懒惰的树

时间:2014-01-25 11:12:46

标签: ocaml lazy-evaluation

我有两种类型:

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

我不知道该怎么做才能正常工作。我尝试了一些事情,但每次我都会遇到一些错误。

1 个答案:

答案 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 =等。