计算Haskell MapReduce代码中的字符数

时间:2013-03-02 17:03:48

标签: mapreduce haskell

在Real World Haskell的Haskell代码第24章中,使用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

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

1 个答案:

答案 0 :(得分:4)

  

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

嗯,不是真的。 ByteString是一串字节。 (如果您想要一串字符,则应使用Data.Text包中Data.Text.Lazytext中的Text

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