Haskell Quiz No.14

難易度: λ

utf8.txtshift-jis.txt はそれぞれ utf8shift-jis で保存されたテキストファイルです。

bad :: IO ()
bad = readFile "./shift-jis.txt" >>= putStrLn

good :: IO ()
good = readFile "./utf8.txt" >>= putStrLn

上記のプログラムを実行すると、こんな感じでエラーになってしまいます。

*Main> good
はすける

*Main> bad
*** Exception: ./shift-jis.txt: hGetContents: invalid argument (invalid byte sequence)

shift-jis で保存されたテキストファイルを読むにはどうしたら良いでしょうか?

答えは次回

はじめに

前回の問題と答えは以下の通りです。

問題

難易度: λλ

以下のプログラムの実行結果はどうなるでしょうか?

#!/usr/bin/env stack
-- stack script --resolver lts-12.0
import Conduit

main :: IO ()
main = runConduit $ yieldMany [1..10] .| iterMC print .| return () .| sinkNull

こたえ

$ ./Quiz13.hs

何も表示されません。

解説

今回は sinkNull があるので全ての値 (1〜10) が上流から流れてくると思う人もいたかもしれません。

しかし、途中で return () が挟まっているため、そこで await の伝達が止まります。そのため、値の要求が yieldMany まで届かないのです。

まとめ

  • await はパイプごとに伝搬して上流に伝わるため、途中で途切れている場合は何も起こらない

以上です。