【问题标题】:Count number of characters in Haskell MapReduce code计算 Haskell MapReduce 代码中的字符数
【发布时间】:2013-03-02 17:03:48
【问题描述】:

在 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

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

【问题讨论】:

  • 使用LB.length 而不是count

标签: mapreduce haskell


【解决方案1】:

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

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

Data.ByteString.Lazy.Char8 导出一个界面,让您假装您正在处理字符,但它假定一个字符 = 一个字节,à la 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 2023-02-25
    • 2017-06-25
    • 1970-01-01
    相关资源
    最近更新 更多