Ocaml:此表达式的类型为';列表*';列表->;bool,但表达式应为bool类型

Ocaml:此表达式的类型为';列表*';列表->;bool,但表达式应为bool类型,ocaml,Ocaml,我刚开始学习Ocaml,正在玩递归函数。Ocaml编译器告诉我,在“IfH1=h2然后helper t1 t2”中递归调用helper会导致一个错误:这个表达式的类型为'a list*'a list->bool,但应该是bool类型的表达式。我知道它告诉我编译器需要一个布尔值,但得到的却是一个返回布尔值的函数。但我不知道我该怎么解决这个问题。谢谢你的帮助 let rec a_func l = let rec helper tmp l1 = function | [], [] -&

我刚开始学习Ocaml,正在玩递归函数。Ocaml编译器告诉我,在“IfH1=h2然后helper t1 t2”中递归调用helper会导致一个错误:这个表达式的类型为'a list*'a list->bool,但应该是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

您的定义
let rec helper tmp l1=function…
定义了一个函数
helper
,该函数包含三个参数:
tmp
l1
,以及模式匹配中使用的匿名参数。这是因为
函数
关键字引入了一个额外的参数,它并不意味着对以前的参数进行模式mantch

看起来您希望在
tmp
l1
上进行匹配。在这种情况下,您可以编写
让rec helper tmp l1=将tmp、l1与…
匹配。您也可以编写
let rec helper=function…
,但它定义了一个接受一对的函数,因此您必须将其称为
helper(t1,t2)
helper([],l)


您还需要在
[h2]@l1
周围加上括号。请注意,更惯用的编写方法是
h2::l1
,但仍然需要括号。最后,OCaml将警告您,您没有理由使用模式
([],::)
您的定义
让rec helper tmp l1=function…
定义一个函数
helper
,该函数包含三个参数:
tmp
l1
,以及模式匹配中使用的匿名参数。这是因为
函数
关键字引入了一个额外的参数,它并不意味着对以前的参数进行模式mantch

看起来您希望在
tmp
l1
上进行匹配。在这种情况下,您可以编写
让rec helper tmp l1=将tmp、l1与…
匹配。您也可以编写
let rec helper=function…
,但它定义了一个接受一对的函数,因此您必须将其称为
helper(t1,t2)
helper([],l)


您还需要在
[h2]@l1
周围加上括号。请注意,更惯用的编写方法是
h2::l1
,但仍然需要括号。最后,OCaml将警告您,您没有理由使用模式
([],\u::\ u)

谢谢您的解释!谢谢你的解释!