Fizbuzz в OCaml получает ошибку «не совместим с типом модуля» - PullRequest
0 голосов
/ 27 мая 2019

У меня есть следующая программа 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. Что мне здесь не хватает?

1 Ответ

2 голосов
/ 27 мая 2019

Это выражение:

  Printf.printf "Fizz: %d \n" i  
  fizbuzz_rr (i - 1)

Имеет форму вызова Printf.printf с 4 аргументами.Вам нужно использовать точку с запятой для разделения двух выражений, которые вы хотите иметь.

Однако после 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 (
  . . .

У вас также есть дополнительный () в конце, который ничего не делает.Вы должны удалить его так:

else (
  Printf.printf "Current Number: %d \n" i ;
  fizbuzz_rr (i - 1)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...