почему альтернативы в определении функций в ocaml дают разные результаты? - PullRequest
0 голосов
/ 28 февраля 2019

ocaml 4.01.0 + ocp1 в windows 10

Впервые в ocaml я столкнулся с интересным поведением в toploop:

 let rec fibo n = function
    0 -> 1
  | 1 -> 1
  | _ -> fibo (n - 1) + fibo (n - 2);;

бросков:

Ошибка: это выражение имеет тип int -> int, но ожидалось выражение типа int

, в то время как

 let rec fibo n = 
  match n with
    0 -> 1
  | 1 -> 1
  | _ -> fibo (n - 1) + fibo (n - 2);; 

работает нормально:

fibo 12 ;;

-: int = 233

Разве эти объявления не должны быть эквивалентными, чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Я немного подробнее расскажу о вашем (совершенно прекрасном) самоответе для будущих читателей.

В OCaml ключевое слово function добавляет анонимный параметр в функцию, которая используется в шаблоне.соответствия.Другими словами, ваша первая попытка

let rec fibo n = function
  | 0 -> 1
  | 1 -> 1
  | _ -> fibo (n - 1) + fibo (n - 2);;

эквивалентна

let rec fibo n m =
  match m with
  | 0 -> 1
  | 1 -> 1
  | _ -> fibo (n - 1) + fibo (n - 2);;

, которая не относится к типу.

Вы можете прочитать больше о function ключевое слово в Реальный мир OCaml .

0 голосов
/ 28 февраля 2019

Это то, что я ошибся в первом определении.Он должен читать:

let rec fibo = function
    0 -> 1
  | 1 -> 1
  | n -> fibo (n - 1) + fibo (n - 2);;

, который тоже отлично работает:

fibo 12 ;;

  • : int = 233
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...