0

在 Real World Haskell 第 24 章的 Haskell 代码中,使用 MapReduce 计算文件中 LINES 数量的示例实现如下:

import qualified Data.ByteString.Lazy.Char8 as LB
lineCount :: [LB.ByteString] -> Int64
lineCount = mapReduce rdeepseq (LB.count '\n')
                      rdeepseq sum

我很清楚这是在计算换行符的数量。如果我想计算 a 的数量,我会这样做:

import qualified Data.ByteString.Lazy.Char8 as LB
lineCount :: [LB.ByteString] -> Int64
lineCount = mapReduce rdeepseq (LB.count 'a')
                      rdeepseq sum

我已经尝试过了,它有效。如何修改此代码以计算字符数(即存在的字符总数?我可以使用某种正则表达式框架吗?

4

1 回答 1

4

我很清楚这是在计算换行符的数量。

嗯,不是真的。AByteString是一个字节串。(如果你想要一个字符串,你应该在文本Text包中使用Data.TextData.Text.Lazy。)

Data.ByteString.Lazy.Char8 导出一个界面,让您假装您正在处理字符,但它假定一个字符 = 一个字节,即 ISO-8859-1 或 ASCII。Unicode 不是。

如何修改此代码以计算字符数(即存在的字符总数?

LB.count :: Char -> ByteString -> Int64,所以我们正在寻找 type 的函数ByteString -> Int64。那个函数是LB.length

lineCount = mapReduce rdeepseq LB.length
                      rdeepseq sum

我可以使用某种正则表达式框架吗?

在 Haskell 中使用成熟的解析器很容易,我们(至少我)使用解析器而不是正则表达式。如果您的数据采用 a ByteString(或 a Text,就此而言)的形式,我建议使用attoparsec

于 2013-03-02T17:27:23.293 回答