Это выражение имеет тип блока, но ожидалось выражение типа строки - PullRequest
0 голосов
/ 09 апреля 2020

Я новичок в Ocaml,

Я пытаюсь понять, как "привести" константу типа "unit" к типу "string".

Я видел, что была функция string_of_int для этого с целочисленным типом, но не может найти эквивалент для типа "unit". Может быть, есть что-то, что связано с Printf , я сделал это с логическим значением, используя Printf.printf "%B" (x);, но я не выяснил, что можно было бы использовать в случае типа "unit".

Вот мой пример кода:

Определенная функция:

let displayList l = List.iter(fun x -> print_string(string_of_int x^";")) l;;

Использование функции выше:

  1. Следующее выражение работает : let _ = displayList [5;5;6;5;5;6;3] in (); и отображает «5; 5; 6; 5; 5; 6; 3;».
  2. Следующее выражение не работает: let _ = print_string ("[" ^ displayList [5;5;6;5;5;6;3] ^ "]") in ();. Выдает сообщение об ошибке «Это выражение имеет тип блока, но ожидалось выражение типа строка».

1 Ответ

1 голос
/ 09 апреля 2020

Вы перепутали напечатанные и возвращенные значения.

displayList не возвращает string. Он печатает string, а затем возвращает unit. Оператор конкатенации строк (^) ожидает два string с, но, как уже упоминалось, тип возврата displayList равен unit.

Создание string из unit не делай то, что, кажется, ты ожидаешь. displayList по-прежнему будет печатать 5;5;6;5;5;6;3;, и ваше выражение будет возвращать строку типа "[()]".

Если вы намеревались напечатать [5;5;6;5;5;6;3;], решение (используя то, что у вас уже есть) может быть

let displayList l =
  print_char '[';
  List.iter(fun x -> print_string(string_of_int x^";")) l;
  print_char ']'
;;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...