9

私はこのコードを書きましたが、ポイントフリー スタイルに書き直す必要があります。

num_of_occ ele list = length(filter(==ele)list) 

だから私はこれをしました:

num_of_occ ele = length . filter((==)ele)

できます。私がこれをしたよりも:

num_of_occ = length . filter . (==)

そして、そうではありません...私の考え方の何が問題になっていますか?

4

1 に答える 1

17

これは一般的なエラーです。修正は次のとおりです。

num_of_occ = (length .) . filter . (==)

それはあなたの関数が取る引数の数と関係があります。関数合成演算子は、1つの引数を持つ関数で機能します。2つの引数を持つ関数で機能させるには(.)、2回適用する必要があります。(f .) .

実際には、Hackageには、コードのスニペットをポイントフリースタイルに自動的に変換するプログラムがあります。

$cabalインストールポイントフリー
$ pointfree'num_of_occ ele list = length(filter(== ele)list)'
num_of_occ =(長さ。)。フィルター 。(==)

前述のように、これが正しく機能するには型署名が必要です。この理由は比較的平凡ですがあいまいであり、Haskellのパフォーマンスを向上させるための制限があります。NoMonomorphismRestriction拡張機能をオンにするか、型署名を追加できます。

num_of_occ :: Eq a => a -> [a] -> Int
num_of_occ = (length .) . filter . (==)
于 2012-11-28T01:41:25.810 に答える