gpt4 book ai didi

haskell - Haskell 中 Word8 和 Word16 之间的转换

转载 作者:行者123 更新时间:2023-12-03 14:31:59 25 4
gpt4 key购买 nike

我试图在 haskell 中进行小端转换,以便我可以将一个 Word16 转换为两个 Word8(例如 258 = 1*256 + 2,所以结果应该是 [2, 1])。然后我将结果打包到一个 ByteString 中。

为此,我创建了以下代码:

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获取字节数 b来自一个号码 num .函数 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] .

最佳答案

fromIntegral可用于各种整数类型之间的转换。

fromIntegral :: (Num b, Integral a) => a -> b

encodeWord16 :: Word16 -> [Word8]
encodeWord16 x = map fromIntegral [getByte 1 x, getByte 2 x]

最好有 getByte返回 Word8 -s:
getByte :: Int -> Word16 -> Word8
getByte b num = fromIntegral $ shift (relevantBits b num) (shiftNum b)
-- where ...

关于haskell - Haskell 中 Word8 和 Word16 之间的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23412500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com