Ocaml:此表达式的类型为“列表*”列表 - >布尔,但预计表达类型bool

时间:2017-02-13 10:02:57

标签: ocaml

我刚开始学习Ocaml并且正在玩递归函数。 Ocaml编译器告诉我在“如果h1 = h2然后帮助器t1 t2”中递归调用帮助器会导致错误:该表达式具有类型'a list *'列表 - >布尔,但预计表达类型bool。我知道它告诉我编译器期望一个布尔值,而是获得一个返回布尔值的函数。但我不知道如何解决这个问题。任何帮助表示赞赏

let rec a_func l =
  let rec helper tmp l1 = function
      | [], [] -> true
      | _, [] -> false
      | h1::t1, h2::t2 -> if h1=h2 then helper t1 t2 else helper [h2]@l1 t2
  in helper [] l

1 个答案:

答案 0 :(得分:4)

您的定义let rec helper tmp l1 = function ...定义了一个函数helper,其中包含三个参数:tmpl1模式匹配中使用的匿名参数。这是因为function关键字引入了另一个参数,表示先前参数的模式符号。

您希望在tmpl1上进行匹配。在这种情况下,您可以编写let rec helper tmp l1 = match tmp, l1 with ...。您也可以编写let rec helper = function ...,但这会定义一个带有的函数,因此您必须将其称为helper (t1, t2)helper ([], l)等。

您还需要在[h2]@l1周围加上括号。请注意,更为惯用的写法是h2::l1,但您仍需要括号。最后,OCaml会警告你,你没有案例([], _::_)

相关问题