2016-06-27 23 views
1

私はこのコードを書いて、ファイルハンドルの行をループし、それと任意のアクションを実行します。私はそれが再帰的である必要があるとは思わない - 私は折り畳みアクションにすることはできますか?回帰回帰を回す?

ありがとうございます!

processHandle :: Handle -> (String->IO()) -> IO() 
processHandle h fn = do 
        eof <- hIsEOF h 
        if eof then 
        return() 
        else do 
         myLine <- hGetLine h 
         fn myLine 
         processHandle h fn 
+0

あなたが探している折り畳みのようなアクションを書いたと思います!実際のコンテナは値がいっぱいではなく、I/Oを使用して値を取得できるハンドルなので、実際の折り畳み自体はありません。 – dfeuer

答えて

6

ハスケルで手動でハンドルを使用することは非常に避けられます。関数型プログラミングスタイルとうまく連動しません。

このような単純な入力処理のために、それはちょうど1(怠け者)文字列としてファイル全体を読むためにおそらく最高だし、その行を処理:

processHandle h fn = mapM_ fn . lines =<< hgetContents h 

もちろん、このこともできます折り返しとして書かれているだけで、the definition of mapM_を検索してください。

ここで、このレイジー-IOアプローチは、多くの深刻なアプリケーションではうまく機能しません。これが1つの巨大なファイルではない場合、厳密にはwith the Data.Text equivalentというファイルを読み込んだ方が良いかもしれません。そうでなければ、処理ステップをインターリーブしたラインを実際に読み取る必要がある場合は、conduitをよく見てください。

+0

ああ、賢い。ありがとう。 – Carbon