2011-10-11 98 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

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