ошибка типа с CamlinternalFormatBasics.fmt - PullRequest
0 голосов
/ 13 октября 2018

Я пишу цикл по рекурсии, и у меня проблема:

let isRectangleIn a b c d =
  if (a > c && b > d) || (a>d && b>c) 
    then 
      "TAK"
    else
      "NIE";;

let rec loop k =
  if k = 0 then 0 else 
  let a = read_int () in
    let b = read_int () in
      let c = read_int () in
        let d = read_int () in
            Printf.printf "%s \n" (isRectangleIn a b c d)
            loop (k-1);;


let i = read_int ();;
let result = loop i;;

Компилятор говорит, что

This expression has type
         ('a -> 'b -> 'c, out_channel, unit, unit, unit, 'a -> 'b -> 'c)
         CamlinternalFormatBasics.fmt
       but an expression was expected of type
         ('a -> 'b -> 'c, out_channel, unit, unit, unit, unit)
         CamlinternalFormatBasics.fmt
       Type 'a -> 'b -> 'c is not compatible with type unit 

, но я не понимаю, что я делаю неправильно.Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 13 октября 2018

Всякий раз, когда вы видите сообщение об ошибке CamlinternalFormatBasics.fmt, это означает, что задействована функция printf.Более того, если в первом параметре формата есть тип функции (здесь 'a -> 'b -> 'c), ошибка заключается в том, что у printf слишком много аргументов по сравнению со строкой формата.

В вашем случае строка форматаis "%s \n", для которого требуется один аргумент, однако вы используете его с 3 аргументами:

Printf.printf "%s \n" (isRectangleIn a b c d) loop (k-1)

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

Основной причиной здесь является отсутствие ; между выражением printf и loop (k-1):

Printf.printf "%s \n" (isRectangleIn a b c d);
loop (k-1)

Чтобы избежать такого рода проблем, обычно рекомендуетсяиспользовать ocp-indent (или ocamlformat) для автоматического отступа кода и избежать ложных отступов.Например, ocp-indent мог бы сдвинуть ваш код как

Printf.printf "%s \n" (isRectangleIn a b c d)
  loop (k-1);;

, что свидетельствует о том, что printf и loop не совпадают с одним уровнем.

...