问题 Haskell如何创建Word8?


我想写一个简单的功能,分裂一个 ByteString 成 [ByteString] 运用 '\n' 作为分隔符。我的尝试:

import Data.ByteString

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

这会引发错误,因为 '\n' 是一个 Char 而不是一个 Word8,这是什么 Data.ByteString.splitWith 期待。

如何将这个简单的角色变成一个 Word8 那 ByteString 会玩吗?


2224
2018-01-23 01:47


起源



答案:


你可以使用数字文字 10,但如果你想转换你可以使用的字符文字 fromIntegral (ord '\n') (该 fromIntegral 需要转换 Int 那 ord 回到了 Word8)。你必须导入 Data.Char 对于 ord

你也可以导入 Data.ByteString.Char8,提供使用功能 Char 代替 Word8 一样的 ByteString 数据类型。 (的确,它有一个 lines 完全符合你想要的功能。)但是,这通常是  推荐,如 ByteString小号  存储Unicode代码点(这是什么 Char 代表)而是原始八位字节(即 Word8S)。

如果您正在处理文本数据,则应考虑使用 Text 代替 ByteString


14
2018-01-23 01:48



哦,哇优秀。我想,我将不得不深入研究角色表征。我不知道角色的数字文字是什么。某个地方有他们的清单吗? - Xander Dunn
我正在编写一个解析蛋白质数据库文件的程序,它包含字符串,整数和双精度数。字符串主要用于从列表中识别正确的项目,而int和double将用于数学运算。我不确定我应该用什么课程。 - Xander Dunn
你可以用 ord 在GHCi中找出代码点的字符数:)我通常从中获取Unicode数据 fileformat.info;该 基础拉丁语 block包含从ASCII继承的128个代码点。 - ehird
至于你的程序的适当类型,它取决于具体的格式和你正在做什么,但如果它们不包含任何二进制数据,那么 Text 会工作得很好。但是,如果字符串始终是纯ASCII,并且您正在处理大量数据,那么 ByteString 可能会更快。 - ehird
是的,文件严格是ASCII,性能是目标。谢谢。 - Xander Dunn


答案:


你可以使用数字文字 10,但如果你想转换你可以使用的字符文字 fromIntegral (ord '\n') (该 fromIntegral 需要转换 Int 那 ord 回到了 Word8)。你必须导入 Data.Char 对于 ord

你也可以导入 Data.ByteString.Char8,提供使用功能 Char 代替 Word8 一样的 ByteString 数据类型。 (的确,它有一个 lines 完全符合你想要的功能。)但是,这通常是  推荐,如 ByteString小号  存储Unicode代码点(这是什么 Char 代表)而是原始八位字节(即 Word8S)。

如果您正在处理文本数据,则应考虑使用 Text 代替 ByteString


14
2018-01-23 01:48



哦,哇优秀。我想,我将不得不深入研究角色表征。我不知道角色的数字文字是什么。某个地方有他们的清单吗? - Xander Dunn
我正在编写一个解析蛋白质数据库文件的程序,它包含字符串,整数和双精度数。字符串主要用于从列表中识别正确的项目,而int和double将用于数学运算。我不确定我应该用什么课程。 - Xander Dunn
你可以用 ord 在GHCi中找出代码点的字符数:)我通常从中获取Unicode数据 fileformat.info;该 基础拉丁语 block包含从ASCII继承的128个代码点。 - ehird
至于你的程序的适当类型,它取决于具体的格式和你正在做什么,但如果它们不包含任何二进制数据,那么 Text 会工作得很好。但是,如果字符串始终是纯ASCII,并且您正在处理大量数据,那么 ByteString 可能会更快。 - ehird
是的,文件严格是ASCII,性能是目标。谢谢。 - Xander Dunn