Ошибка типа Ocaml путаница: почему это делает ошибку?
let rec add_tail l e = match l with
| [] -> [e]
| (h::t) -> h::(add_tail t e)
let rec fill_help l x n = match n = 0 with
true -> l
| false -> add_tail(l, x); fill_help(l, x, n-1)
let fill x n =
let l = [] in
fill_help(l, x, n)
И я получаю ошибку в интерпретаторе
# #use "prac.ml";;
val prod : int list -> int = <fun>
val add_tail : 'a list -> 'a -> 'a list = <fun>
File "prac.ml", line 13, characters 21-27:
Error: This expression has type 'a * 'b
but an expression was expected of type 'c list
Строка 13 будет
| false -> add_tail(l, x); fill_help(l, x, n-1)
1 ответ:
Во-первых, вы вызываете
Во-вторых, вы вызываете функцию без побочных эффектов (fill_help
с кортежем в качестве аргумента ((l, x, n-1)
), даже если он не определен, чтобы взять один. Вместо этого вы должны вызватьfill_help
какfill_help l x (n-1)
. То же самое дляadd_tail
.add_tail
) и отбрасываете ее возвращаемое значение. Это почти всегда ошибка. Похоже, вы ожидаете, чтоl
будет отличаться после вызоваadd_tail
. Этого не будет. Вы, вероятно, хотитеfill_help (add_tail l x) x (n-1)
.