在《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.