椿の日記

たぶんプログラムの話をします

Data.ByteString.Lazyでハマる

IConvパッケージを入れたのはソケットから取得したテキストを変換しながら出力したかったためなのですが、この変換関数がByteString.Lazyを受け付けるので少々厄介なことになっております。

    cs <- hGetContents sock
    putStrLn cs

これだと、sockから送信されてきたデータをすぐに画面に表示することができるのですが、

import qualified Data.ByteString.Lazy as L
...

    cs <- L.hGetContents sock
    L.putStrLn cs

これだと、すぐには表示されません。CTRL+Cを押して動作を止めるときに、内容を画面に表示してプログラムを停止します。(試してないけど、多分大量のデータが発生すると、評価が始まるのでしょう)

要するにByteString.Lazyで値をバッファリングしているためなんでしょうが、少しずつ変換して少しずつ応答しなければならない状況なので、その仕様はちょっと困る。

さて、どうしたもんかなあ…