将位转换为Int8 Haskell

时间:2015-12-07 21:59:32

标签: haskell byte bit bit-shift ghci

尝试将Bits(0,1)列表转换为Int8或类似的东西,这样我就不会浪费ByteString上的一个字节只有1位

例如,我可能有一个像[0,1,0,0,0,1,1,1,1,0]这样的列表,它作为ByteString表示每个列为Byte而不是Bit。

1 个答案:

答案 0 :(得分:5)

一种解决方案是折叠列表:

import Data.Bits (Bits, shiftL, (.|.))

pack :: (Num b, Foldable t, Bits b) => t b -> b
pack a = foldl go 0 a
    where go acc i = (acc `shiftL` 1) .|. i

你得到:

\> pack [0,1,0,0,0,1,1,1,1,0]
286