如何使用Stream.iter处理OCaml中stdin的行

时间:2014-02-24 00:54:48

标签: stream ocaml stdin

我正在尝试在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,对吗?

1 个答案:

答案 0 :(得分:3)

类型为'a Stream.t -> unit的函数为Stream.iter。基本上,编译器告诉您Stream.iter没有任何命名参数。你试图传递一个名为f的参数,这就是问题所在。

解决方案是删除~f:。 (我没有测试过,因为我没有你的代码。)