遅延評価に嵌る
お約束中のお約束と思います。
バイト列の読み込み
サイズが196623バイトのファイルがありまして。
[testuser]$ ls -al ./girl.ppm -rw-r--r-- 1 testuser testuser 196623 4月 20 06:54 ./girl.ppm
ghciを起動して。
[testuser]$ ghci GHCi, version 7.6.3: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linking ... done. Loading package base ... linking ... done.
バイトの配列として読み込みをすると、
Prelude> Data.Binary.decodeFile "./girl.ppm" :: IO [Data.Word.Word8] Loading package array-0.4.0.1 ... linking ... done. Loading package deepseq-1.3.0.1 ... linking ... done. Loading package bytestring-0.10.0.2 ... linking ... done. Loading package containers-0.5.0.0 ... linking ... done. Loading package binary-0.5.1.1 ... linking ... done. *** Exception: too few bytes. Failed reading at byte position 196624 Prelude>
196624バイト目を読み込もうとするが存在しないのでエラーとなります。
いい感じの関数があるのかHoogle等で探しましたが、見つけられず。バイト列を読み込むちょっとした関数を作る必要がありそうです。ちょっと面倒ですね。
型が合わない?
こちらは遅延評価されるので問題ないように思えたのですが、違いました。
Prelude> let [a, b, c] = [1, 2, 3] Prelude> print b 2 Prelude> let [a, b, c] = [1, 2, 3, 4] Prelude> print b *** Exception: <interactive>:19:5-28: Irrefutable pattern failed for pattern [a, b, c] Prelude>
やるなら下記ですね。
Prelude> let [a, b, c] = take 3 [1, 2, 3, 4] Prelude> print b 2 Prelude>