У меня есть следующая программа fizbuzz, написанная на OCaml (с небольшим количеством рекурсии):
let rec fizbuzz_r =
let rec fizbuzz_rr i =
if i == 0 then
()
else if i mod 3 == 0 && i mod 5 != 0 then
Printf.printf "Fizz: %d \n" i
fizbuzz_rr (i - 1)
else if i mod 3 != 0 && i mod 5 == 0 then
Printf.printf "Buzz: %d \n" i
fizbuzz_rr (i - 1)
else if i mod 5 == 0 && i mod 3 == 0 then
Printf.printf "Fizbuzz: %d \n" i
fizbuzz_rr (i - 1)
else
Printf.printf "Current Number: %d \n" i
fizbuzz_rr (i - 1)
()
in
fizbuzz_rr 100
let () = fizbuzz_r
Проблема в том, что когда я его компилирую, я получаю следующее сообщение об ошибке:
Error: This expression has type
('a -> 'b -> 'c -> 'd, out_channel, unit, unit, unit,
'a -> 'b -> 'c -> 'd)
CamlinternalFormatBasics.fmt
but an expression was expected of type
('a -> 'b -> 'c -> 'd, out_channel, unit, unit, unit, unit)
CamlinternalFormatBasics.fmt
Type 'a -> 'b -> 'c -> 'd is not compatible with type unit
Однако мне кажется, что вложенная функция fizbuzz_rr
правильно возвращает тип unit
. Что мне здесь не хватает?