Reputation: 37
I just started learning Ocaml and am playing around with recursive functions. Ocaml Compiler is telling me that recursively calling helper in "if h1=h2 then helper t1 t2" causes an error: This expression has type 'a list * 'a list -> bool but an expression was expected of type bool. I understand that it is telling me that the compiler is expecting a boolean but instead gets a function that returns the boolean. But I have no idea how I can fix this. Any help is appreciated
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
Upvotes: 0
Views: 1352
Reputation: 9378
Your definition let rec helper tmp l1 = function ...
defines a function helper
which takes three arguments: tmp
, l1
, and an anonymous argument which is used in the pattern match. This is because the function
keyword introduces an additional argument, it does not mean a pattern mantch on previous arguments.
It looks like you want to match on tmp
and l1
. In that case, you can write let rec helper tmp l1 = match tmp, l1 with ...
. You can also write let rec helper = function ...
, but that defines a function that takes a pair, so you would have to call it as helper (t1, t2)
, helper ([], l)
etc.
You will also need to put parentheses around [h2]@l1
. Note that a more idiomatic way of writing this is h2::l1
, but you will still need the parentheses. Finally, OCaml will warn you that you have no case for the pattern ([], _::_)
.
Upvotes: 4