将位转换为Int8 Haskell

ast*_*fel 3 byte haskell bit-shift bit ghci

尝试将位(0,1)的列表转换为Int8或类似内容,以便我不会仅从1位上浪费ByteString中的一个字节

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

beh*_*uri 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
Run Code Online (Sandbox Code Playgroud)

你会得到:

\> pack [0,1,0,0,0,1,1,1,1,0]
286
Run Code Online (Sandbox Code Playgroud)