OCaml - чтение из файла и разделение на символы - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь прочитать из файла в OCaml и разбить каждую строку на список строк, разделенных пробелами, а затем добавить этот список в накопительный список. Я получаю ошибку:

File "bin/scanner.ml", line 17, characters 25-42: Error: This expression has type string list but an expression was expected of type unit

Вся моя программа (scanner.ml):

  1 let tokens = [];;
  2 
  3 let split_spaces line =
  4     (String.split_on_char ' ' line) @ tokens;
  5     ;;
  6 
  7 (* Read input from an external file *)
  8 let line_stream_of_channel channel =
  9     Stream.from
 10         (fun _ ->
 11             try Some (input_line channel) with End_of_file -> None)
 12     ;;
 13 
 14 let in_channel = open_in "./input_files/test.c" in
 15     try
 16         Stream.iter
 17             (fun line -> split_spaces line)
 18         (line_stream_of_channel in_channel);
 19         close_in in_channel
 20     with e ->
 21         close_in in_channel;
 22         raise e
 23     ;;

Мне кажется, я понимаю, что ошибка в том, что split_space возвращает список строк, в то время как анонимная функция в строке 17 ожидает функцию, возвращающую единицу типа. Я застрял в том, как я могу изменить split_spaces так, чтобы его возвращаемый тип был единицей.

1 Ответ

0 голосов
/ 09 ноября 2018

Функция, которая возвращает единицу, является функцией императивного стиля, которая делает что-то для своего побочного эффекта и не возвращает полезного значения.

Если все ваши функции возвращают единицу, как вы соберете свой список слов?

На самом деле, я не вижу этого совокупного списка слов нигде в вашем коде.

Дело в том, что вы, вероятно, хотите пойти другим путем. Вы хотите заменить Stream.iter, что является обязательной функцией с побочными эффектами. Вместо этого вам, скорее всего, понадобится ваша собственная функция, которая вызывает Stream.next и возвращает накопленное значение (а не единицу).

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