OCaml - Печать возвращаемого значения рекурсивной фаторной функции не работает - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть этот код:

let n = read_int()
let rec fact n = if n=0 then 1 else n*fact(n-1)
let () = Printf.printf "%d factorial is %d.\n" n fact(n)

Я компилирую, а затем компилятор говорит:

File "fat.ml", line 3, characters 23-46:
Error: This expression has type
         ('a -> 'b, out_channel, unit, unit, unit, 'a -> 'b)
         CamlinternalFormatBasics.fmt
       but an expression was expected of type
         ('a -> 'b, out_channel, unit, unit, unit, unit)
         CamlinternalFormatBasics.fmt
       Type 'a -> 'b is not compatible with type unit

Как я могу напечатать возвращаемое значение?

1 Ответ

0 голосов
/ 28 сентября 2018

Проблема заключается в отсутствии круглых скобок вокруг fact n:

let () = Printf.printf "%d factorial is %d.\n" n (fact n)

работает.

Причиной возникновения сложной ошибки типа является то, что компилятор читает

let () = Printf.printf "%d factorial is %d.\n" n fact(n)

as

let () = Printf.printf "%d factorial is %d.\n" n fact n

Другими словами, для компилятора функция printf применяется к 4 аргументам: "%d factorial is %d.\n", n, fact и n.

Но строка формата, назовем ее fmt, содержит только два спецификатора %d.Таким образом, компилятор также знает, что printf fmt должен принять два аргумента и затем вернуть единицу.Существует несоответствие: ожидается, что Printf.printf fmt n fact вернет функцию, которая может быть применена к последнему аргументу n, но вернет единицу.Или, другими словами,

Тип 'a ->' b не совместим с типом unit

Предыдущая часть ошибки

Это выражение имеет тип ('a ->' b, out_channel, unit, unit, unit, 'a ->' b) CamlinternalFormatBasics.fmt, но ожидалось выражение типа ('a ->' b, out_channel, unit,единица измерения, единица измерения, единица измерения) CamlinternalFormatBasics.fmt

обусловлена ​​тем, что тип строки форматирования является очень гибким, и поэтому проверка типов завершается неудачно только тогда, когда обнаруживается, что невозможно распечататьстрока формата и возвращает единицу с предоставленными аргументами.

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