我正在尝试从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。
答案 0 :(得分:0)
返回unit的函数是一种命令式函数,它会产生一些副作用,并且不会返回有用的值。
如果您的函数全部返回单位,您将如何累积单词列表?
事实上,我在您的代码中的任何地方都看不到该单词的累积列表。
事实是您可能想另辟go径。您要替换Stream.iter
,这是一个具有副作用的命令功能。相反,您很可能希望自己的函数调用Stream.next
并返回一个累加值(而不是单位)。