尝试将位(0,1)的列表转换为Int8或类似内容,以便我不会仅从1位上浪费ByteString中的一个字节
例如,我可能有一个像[0,1,0,0,0,1,1,1,1,0]之类的列表,它作为ByteString表示每个列表为Byte而不是Bit。
一种解决方案是仅折叠列表:
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