在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
我试过这个,它确实有效。如何修改此代码以计算字符数(即存在的字符总数?我可以使用某种正则表达式框架吗?
答案 0 :(得分:4)
我很清楚这是在计算换行符的数量。
嗯,不是真的。 ByteString
是一串字节。 (如果您想要一串字符,则应使用Data.Text包中Data.Text.Lazy或text中的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。