0

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

私はこれを試しましたが、うまくいきます。このコードを変更して文字数 (つまり、存在する文字の総数) をカウントするにはどうすればよいですか?使用できる正規表現フレームワークはありますか?

4

1 に答える 1

4

これが改行文字の数を数えていることは明らかです。

まあ、そうではありません。AByteStringはバイト文字列です。(文字列が必要な場合は、テキストパッケージのData.TextTextまたはData.Text.Lazyを使用する必要があります。)

Data.ByteString.Lazy.Char8 は、文字を扱っているふりをすることができるインターフェイスをエクスポートしますが、ISO-8859-1 または ASCII のように、1 文字 = 1 バイトであると想定しています。Unicode ではありません。

文字数をカウントするようにこのコードを変更するにはどうすればよいですか (つまり、存在する文字の総数は?

LB.count :: Char -> ByteString -> Int64であるため、タイプ の関数を探していますByteString -> Int64。その機能はLB.length.

lineCount = mapReduce rdeepseq LB.length
                      rdeepseq sum

使用できる正規表現フレームワークはありますか?

Haskell で本格的なパーサーを使用するのは簡単で、(少なくとも私は) 正規表現の代わりにパーサーを使用します。データが a ByteString(または a 、さらに言えば) の形式である場合は、 attoparsecTextを使用することをお勧めします。

于 2013-03-02T17:27:23.293 に答える