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