统计Haskell MapReduce代码中的字符数



在《Real World Haskell, Chapter 24》中的Haskell代码中,使用MapReduce计算文件中的行数的示例如下:

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

我试过了,它很有效。我如何修改这个代码来计算字符的数量(即字符的总数)?我可以使用某种正则表达式框架吗?

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

嗯,不完全是。ByteString是一个字节串。(如果你想要一个字符串,你应该使用Text从Data。文本或数据。文本。懒,在文本包中。)

Data.ByteString.Lazy。Char8导出一个接口,该接口允许您假装正在处理字符,但它假设一个字符=一个字节,例如ISO-8859-1或ASCII。它不是Unicode。

如何修改此代码以计算字符数(即当前字符总数)?

LB.count :: Char -> ByteString -> Int64,所以我们在寻找ByteString -> Int64类型的函数。该函数为LB.length

lineCount = mapReduce rdeepseq LB.length
                      rdeepseq sum

是否有某种正则表达式框架我可以使用?

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

相关内容

  • 没有找到相关文章

最新更新