OCaml에서 stdin의 데이터를 라인 지향 방식으로 처리하려고하는데, Stream.iter
을 사용하여 형식을 정렬하는 데 문제가 있습니다. 나는 OCaml의 웹 사이트 (http://ocaml.org/learn/tutorials/streams.html)에 다음과 같은 코드를 발견OCaml에서 stdin의 행을 처리하기 위해 Stream.iter를 사용하는 방법
let line_stream_of_channel channel =
Stream.from
(fun _ ->
try Some (input_line channel) with End_of_file -> None)
이를 사용하여, 나는 몇 가지 일을 한 줄을 읽고, 다시 일부 데이터를 인쇄하는 간단한 함수를 작성했습니다. 나는 함수가 잘 작동한다고 생각하기 때문에 세부 사항을 삭제할 것이다. 그래도 형식이 string -> unit
이어야합니다 (예 : print_endline
). 내 함수를 전달했는지 또는을 Stream.iter
으로 전달했는지 컴파일러에서 가져 오는 오류는 같습니다.
let read_data =
Stream.iter ~f:print_summary (line_stream_of_channel In_channel.stdin)
내가 컴파일러에서 얻을 오류는 이것이다 : 내가 어떤 문제없이 과거에 Stream.iter을 사용했습니다
Error: The function applied to this argument has type 'a Stream.t -> unit
This argument cannot be applied with label ~f
여기 전화입니다. print_endline
의 유형이 'a Stream.t -> unit
인 것으로 생각하면 혼란 스럽습니다. string -> unit
일까요?
내가 가진 (print_summary) 함수의 타입은'string -> unit'이지만 'line_stream_of_channel'은'string option -> unit'의 스트림을 생성했습니다. 사실,'Stream.iter'을 사용하여 stdin 데이터를 처리하기 위해, 라인 스트림이 EOF가 아닌, 또는 구현되지 않은 EOF를 반환하도록합니다. 궁극적 인 해결책은 줄 주위를 감싸는 옵션을 제거하고 그냥'Stream.from'을 사용하는 것이 었습니다. –