2011-10-11 99 views
2

在Haskell中工作時,我正在嘗試將大量布爾值列表寫入二進制文件。使用Haskell將[Bool]寫入二進制文件

我可以將Word8(這是一個8位字)寫入文件,但無法弄清楚如何從八個Bool列表轉換爲Word8。

這是我到目前爲止有:

toByte :: [Bool] -> Word8 
toByte list = toByteh list 0 0 

toByteh :: [Bool] -> Int -> Word8 -> Word8 
toByteh list 8 _ = 0 
toByteh list i result 
    | head list == True = toByteh (tail list) (i + 1) (result .|. (2^i :: Word8)) 
    | otherwise = toByte_h (tail list) (i + 1) result 

當我使用這個我只是得到一個0字節。任何人都可以看到這不工作? 還是有更好的方法來做到這一點?

回答

5

您從0開始計數i,當您到達8時,您將返回0。我覺得你的意思返回result代替:

toByteh list 8 result = result 
4

總是很高興寫這樣的功能,但如果你開始感覺無聊,你也可以

toByte = foldl (\word\bit -> 2*word + (if bit then 1 else 0)) 0 

(在這裏,列表的頭被認爲是最低位,如果你不喜歡則反過來。)

+0

很酷!它有助於以不同的方式看待事物,謝謝! –