8

Haskellで簡単なテキスト処理を行おうとしていますが、FP言語でこれを行うための最良の方法は何でしょうか。パーセクモジュールを見ましたが、これは新しいハスケラーとして探しているよりもはるかに洗練されているようです。テキストのコーパスからすべての句読点を取り除く最良の方法は何でしょうか?私の素朴なアプローチは、次のような関数を作成することでした。

removePunc str = [c | c <- str, c /= '.',
                                 c /= '?',
                                 c /= '.',
                                 c /= '!',
                                 c /= '-',
                                 c /= ';',
                                 c /= '\'',
                                 c /= '\"',]
4

3 に答える 3

11

おそらくより効率的な方法(O(n)ではなくO(log n))は、SetData.Setから)を使用することです。

import qualified Data.Set as S

punctuation = S.fromList ",?,-;'\""

removePunc = filter (`S.notMember` punctuation)

notElemセットを作成するオーバーヘッドは他の人が提案した単純な線形時間テストよりもはるかに大きいため、関数の外部でセットを作成する必要があります。これにより、(すべての呼び出しで共有されることにより)1回だけ計算されます。

注:これは非常に小さな状況であるSetため、リストの漸近的な利点よりもオーバーヘッドが大きくなる可能性があるため、絶対的なパフォーマンスを求めている場合は、これをプロファイルする必要があります。

于 2012-07-11T02:36:29.097 に答える
8

あなたは単にあなたのコードを書くことができます:

removePunc = filter (`notElem` ".?!-;\'\"")

また

removePunc = filter (flip notElem ".?!-;\'\"")
于 2012-07-11T01:30:00.757 に答える
4

文字を文字列にグループ化し、notElemを使用できます。

[c | c <- str, c `notElem` ".?!,-;"]

またはより機能的なスタイルで:

filter (\c -> c `notElem` ".?!,") str
于 2012-07-11T01:16:06.500 に答える