将[Int]强制转换为[Word8]

8
如何将整数列表 [Int] 转换为字节列表 [Word8]?我可以使用 let a = 1 :: Word8 来转换单个整数。但是如何对整数值列表执行相同的操作呢?这样做时,我会遇到错误。
(另外,我的主要目标是从 [Int] -> ByteString 进行转换,我正在使用 [Word8] 作为中间步骤,是否有更好的方法来完成这个过程?)

2
这里并没有转换成 Int(实际上,也没有涉及到任何 Int);与其他语言不同的是,在 Haskell 中,像 1 这样的字面量没有特定的类型,而是具有多态类型 Num a => a,这意味着它可以与任何数值类型一起使用。它还被定义为与 fromInteger (1 :: Integer) 相同,因此它是一个函数调用,而不是一个转换。(尽管编译器最终将能够将其优化为转换。) - Alexey Romanov
2个回答

13

试试使用fromIntegral,这是一种在不同整数类型之间进行转换的瑞士军刀工具:Data.ByteString.pack (map fromIntegral [97..97 + 25])应该会产生"abcdefghijklmnopqrstuvwxyz" :: Data.ByteString

至于是否为最佳方法,一旦你有了一个Int列表,除了支付转换成本外,你不能做太多事情。Int是32位机器整数,其中三个位用于标记(我认为),而Word8是8位机器整数。如果性能是个问题,可能只需从一开始就使用Word8


7

要在不同的数字类型之间进行转换,请使用fromIntegral。在您的情况下,您需要使用map fromIntegral。请注意,如果从您的程序中无法推断出fromIntegral的返回类型,则可能需要指定一些类型。

要生成ByteString,请尝试:Data.ByteString.pack . map fromIntegral


在这里使用 Data.ByteString.Char8 可能不是一个好主意 - 除非你需要通过它,否则 CharWord8 效率要低得多。 - Ørjan Johansen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接