如何在Haskell中创建一个Word8?

15

我想编写一个简单的函数,将 ByteString 按照 '\n' 作为分隔符将其拆分成 [ByteString]。下面是我的尝试:

import Data.ByteString

listize :: ByteString -> [ByteString]
listize xs = Data.ByteString.splitWith (=='\n') xs

这会抛出一个错误,因为'\n'是一个Char而不是一个Word8,而Data.ByteString.splitWith期望的是Word8

如何将这个简单的字符转换为ByteString可以处理的Word8

1个回答

17
你可以直接使用数字字面量10,但如果你想要转换字符字面量,可以使用fromIntegral (ord '\n')(需要fromIntegralord返回的Int转换为Word8)。你需要导入Data.Char库来使用ord函数。
你也可以导入Data.ByteString.Char8库,它提供了在相同的ByteString数据类型上使用Char而不是Word8的函数。(确实,它有一个lines函数,它恰好做你想做的事情。)但是,这通常不被推荐,因为ByteString不存储Unicode码点(即Char表示的内容),而是原始的八位字节(即Word8)。
如果你正在处理文本数据,则应该考虑使用Text而不是ByteString

哦,太棒了。我想我得深入研究字符表示了。我不知道字符的数字字面值是什么。有没有它们的列表? - Xander Dunn
我正在编写一个程序,用于解析蛋白质数据库文件,这些文件包含字符串、整数和双精度浮点数。这些字符串主要用于从列表中识别正确的项目,而整数和双精度浮点数将用于数学运算。我不确定应该使用哪个类来实现这个功能。 - Xander Dunn
1
你可以在GHCi中使用ord函数来查找字符的编码数字 :) 我通常从fileformat.info获取Unicode数据; 基本拉丁字符块包含了从ASCII继承下来的128个代码点。 - ehird
2
关于程序中适当的类型,这取决于具体的格式和你要做什么,但如果它们不包含任何二进制数据,则 Text 就可以正常工作。然而,如果字符串始终是纯 ASCII,并且你正在处理大量数据,则 ByteString 可能更快。 - ehird
是的,这些文件严格遵循ASCII格式,并且性能是我们的目标。谢谢。 - Xander Dunn
1
我现在该如何创建一个Word8? - peer

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