我正在尝试在OCaml中以面向行的方式处理来自stdin的数据,但是我无法使用Stream.iter
来排列类型。我在OCaml网站(http://ocaml.org/learn/tutorials/streams.html)上找到了以下代码段:
let line_stream_of_channel channel =
Stream.from
(fun _ ->
try Some (input_line channel) with End_of_file -> None)
使用这个,我写了一个简单的函数,读取一行做了一些事情,然后打印一些数据。我会忽略细节,因为我相信这个功能很好用。它应该具有类型string -> unit
,就像(例如)print_endline
一样,无论是通过我的函数还是print_endline
,我从编译器得到的错误都是一样的Stream.iter
。
这是电话:
let read_data =
Stream.iter ~f:print_summary (line_stream_of_channel In_channel.stdin)
我从编译器得到的错误是:
Error: The function applied to this argument has type 'a Stream.t -> unit
This argument cannot be applied with label ~f
我过去使用过Stream.iter没有遇到任何麻烦。令人困惑的是,它认为print_endline
的类型为'a Stream.t -> unit
- 它应该是string -> unit
,对吗?
答案 0 :(得分:3)
类型为'a Stream.t -> unit
的函数为Stream.iter
。基本上,编译器告诉您Stream.iter
没有任何命名参数。你试图传递一个名为f
的参数,这就是问题所在。
解决方案是删除~f:
。 (我没有测试过,因为我没有你的代码。)