将位转换为Int8 Haskell

将位转换为Int8 Haskell,haskell,byte,bit,bit-shift,ghci,Haskell,Byte,Bit,Bit Shift,Ghci,尝试将位列表(0,1)转换为Int8或类似的内容,这样我就不会在1位上浪费ByteString的一个字节 例如,我可能有一个类似于[0,1,0,0,0,1,1,1,1,0]的列表,它作为ByteString将每个列表表示为一个字节而不是一个位。一个解决方案是将列表折叠起来: import Data.Bits (Bits, shiftL, (.|.)) pack :: (Num b, Foldable t, Bits b) => t b -> b pack a = foldl go

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


例如,我可能有一个类似于[0,1,0,0,0,1,1,1,1,0]的列表,它作为ByteString将每个列表表示为一个字节而不是一个位。

一个解决方案是将列表折叠起来:

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

@astiefel您可以跨数字类型转换;看,有没有办法扭转这种局面?因为我有以下解包方法:
unpack::Word8->[Word8]unpack 0=[0]unpack x=reverse(go x),其中go 0=[]go n | n
mod`2==1=1:go(n
div
2)| n
mod
2==0=0:go(n
div
2)|否则=[]`但我无法打包然后解包