2014-02-24 1 views
3

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일까요?

+0

내가 가진 (print_summary) 함수의 타입은'string -> unit'이지만 'line_stream_of_channel'은'string option -> unit'의 스트림을 생성했습니다. 사실,'Stream.iter'을 사용하여 stdin 데이터를 처리하기 위해, 라인 스트림이 EOF가 아닌, 또는 구현되지 않은 EOF를 반환하도록합니다. 궁극적 인 해결책은 줄 주위를 감싸는 옵션을 제거하고 그냥'Stream.from'을 사용하는 것이 었습니다. –

답변

3

'a Stream.t -> unit 유형의 기능은 Stream.iter입니다. 기본적으로 컴파일러는 Stream.iter에 명명 된 매개 변수가 없음을 알려줍니다. 당신은 f이라는 매개 변수를 전달하려고합니다. 문제가 있습니다.

해결 방법은 ~f:입니다. (나는 당신의 코드를 가지고 있지 않기 때문에 테스트를하지 않았다.)

+0

Doh. 네 말이 맞아. 고마워. 코드는 여전히 작동하지 않지만 문제는 이제 다른 곳에서 발생합니다. 실제로 여기에 게시 한 코드에 또 다른 명백한 버그가있는 것을 발견하면이를 메모로 수정합니다. –