> (fromIntegral . fromEnum) True
1
好。
> (fromIntegral . fromEnum) (10000 :: Int)
10000
好。
λ (fromIntegral . fromEnum) 100000000000000000000
7766279631452241920
不好。
我正在与Data.Bits
进行一些比较,并寻找一种合并Bool
,Int
和Integer
所代表字段的通用方法。 Integer
字段可能非常大。
我要做的整体事情看起来像这样:
fromExchange :: Exchange -> Integer
fromExchange e = foldr combineBits 0 collectBits
where
combineBits = ((.|.) . ($ e))
collectBits =
[ (`shiftL` 127) . toBits . doCommand
, (`shiftL` 126) . toBits . readComplete
, (`shiftL` 116) . fromIntegral . destId
, (`shiftL` 64) . address
, payload
, (`shiftL` 108) . fromIntegral . mask
, (`shiftL` 104) . fromIntegral . fromCommand . command
]
toBits :: Enum a =>
a -> Integer
toBits = fromIntegral . fromEnum
如果可能,我想要考虑toBits/fromIntegral
。