Ошибка типа Ocaml: почему это делает ошибку? - PullRequest
2 голосов
/ 16 марта 2011
    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 Ответ

4 голосов
/ 16 марта 2011

Прежде всего, вы вызываете 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).

...