IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

遅延評価に嵌る

お約束中のお約束と思います。

バイト列の読み込み

サイズが196623バイトのファイルがありまして。

[testuser]$ ls -al ./girl.ppm 
-rw-r--r-- 1 testuser testuser 196623  420 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>