OCaml-从文件读取并按字符拆分

时间:2018-11-09 00:24:20

标签: split stream ocaml

我正在尝试从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使其返回类型为unit。

1 个答案:

答案 0 :(得分:0)

返回unit的函数是一种命令式函数,它会产生一些副作用,并且不会返回有用的值。

如果您的函数全部返回单位,您将如何累积单词列表?

事实上,我在您的代码中的任何地方都看不到该单词的累积列表。

事实是您可能想另辟go径。您要替换Stream.iter,这是一个具有副作用的命令功能。相反,您很可能希望自己的函数调用Stream.next并返回一个累加值(而不是单位)。