アレクサンダー・プロコフィエフの答えに基づいて:
repetitions x = concat (map tail (filter (\x -> (length x) > 1) (List.group (word (filter (\c -> (c >= 'a' && c <= 'z') || (c>='A' && c <= 'Z') || c==' ') x)))))
不要な括弧を削除します:
repetitions x = concat (map tail (filter (\x -> length x > 1) (List.group (word (filter (\c -> c >= 'a' && c <= 'z' || c>='A' && c <= 'Z' || c==' ') x)))))
$ を使用してさらに括弧を削除します (終わりの括弧が式の最後にある場合、各 $ は開き括弧を置き換えることができます)。
repetitions x = concat $ map tail $ filter (\x -> length x > 1) $ List.group $ word $ filter (\c -> c >= 'a' && c <= 'z' || c>='A' && c <= 'Z' || c==' ') x
文字範囲を Data.Char の関数に置き換え、concat と map をマージします。
repetitions x = concatMap tail $ filter (\x -> length x > 1) $ List.group $ word $ filter (\c -> isAlpha c || isSeparator c) x
単純化するために、ポイントフリー スタイルでセクションとカリー化を使用し(\x -> length x > 1) to ((>1) . length)
ます。これは、右から左へのパイプラインlength
で (>1) (部分的に適用された演算子、またはセクション) と結合します。
repetitions x = concatMap tail $ filter ((>1) . length) $ List.group $ word $ filter (\c -> isAlpha c || isSeparator c) x
明示的な "x" 変数を削除して、式全体をポイントフリーにします。
repetitions = concatMap tail . filter ((>1) . length) . List.group . word . filter (\c -> isAlpha c || isSeparator c)
右から左に読み取る関数全体は、アルファまたは区切り文字のみをフィルタリングし、それを単語に分割し、グループに分割し、複数の要素を持つグループをフィルタリングし、残りのグループを最初のグループに減らすパイプラインです。それぞれの要素。