尝试将Bits(0,1)列表转换为Int8或类似的东西,这样我就不会浪费ByteString上的一个字节只有1位
例如,我可能有一个像[0,1,0,0,0,1,1,1,1,0]这样的列表,它作为ByteString表示每个列为Byte而不是Bit。
答案 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