我想在Haskell中進行小端轉換,以便我可以將Word16轉換爲兩個Word8(例如258 = 1 * 256 + 2,因此結果應該是[2,1 ])。然後我將結果打包成一個ByteString。Haskell中的Word8和Word16之間的轉換
我創建了下面的代碼用於此目的:
import Data.Word
import Data.Bits
getByte b num = shift (relevantBits b num) (shiftNum b)
where bitMask b = sum $ map (2^) [8*b-8 .. 8*b-1]
relevantBits b num = num .&. bitMask b
shiftNum b = 8-8*b
encodeWord16 x = [getByte 1 x, getByte 2 x]
input :: Word16
input = 355
output :: [Word8]
output = encodeWord16 input
功能getByte
從一些num
得到字節數b
。函數encodeWord16
使用此輔助函數進行小端轉換。
然而,這並不編譯,我得到的錯誤:
Couldn't match expected type `Word8' with actual type `Word16'
In the first argument of `encodeWord16', namely `input'
In the expression: encodeWord16 input
In an equation for `output': output = encodeWord16 input
我(非常不繫統)試圖通過隨機分佈fromIntegral
表達式來達到預期的效果,但顯然我的Haskell的類型系統的理解是不足以解決這個問題。有沒有系統的方法來解決這個問題? 基本上我想要功能encodeWord16
有類型簽名Word16 -> [Word8]
。
是的,這看起來像一個更有效的方式來做到這一點。我仍然需要應用'來自整體的地圖'(參見AndrásKovács的回答)。 – Julian
@Julian是的,因爲如果'x'的類型是'Word16',那麼'x。&的類型。 0xFF'也將是'Word16'。 –
有沒有辦法做Word8 - > [Word8]?也叫他們把位列表 – astiefel