使用Haskell将[Bool]写入二进制文件

时间:2011-10-11 10:57:44

标签: haskell

在Haskell工作,我正在尝试将一个大的布尔值列表写入二进制文件。

我可以将Word8(这是一个8位字)写入文件,但无法弄清楚如何从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字节。任何人都可以看到这不起作用的地方? 或者有更好的方法吗?

2 个答案:

答案 0 :(得分:5)

您从i计算0,当您到达8时,您将返回0。我想你的意思是返回result

toByteh list 8 result = result

答案 1 :(得分:4)

编写这样的函数总是很好,但是如果你开始觉得无聊,你也可以

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

(这里,列表的头部被视为最低位,如果你不喜欢,则反转。)