私はこのコードを書きましたが、ポイントフリー スタイルに書き直す必要があります。
num_of_occ ele list = length(filter(==ele)list)
だから私はこれをしました:
num_of_occ ele = length . filter((==)ele)
できます。私がこれをしたよりも:
num_of_occ = length . filter . (==)
そして、そうではありません...私の考え方の何が問題になっていますか?
私はこのコードを書きましたが、ポイントフリー スタイルに書き直す必要があります。
num_of_occ ele list = length(filter(==ele)list)
だから私はこれをしました:
num_of_occ ele = length . filter((==)ele)
できます。私がこれをしたよりも:
num_of_occ = length . filter . (==)
そして、そうではありません...私の考え方の何が問題になっていますか?
これは一般的なエラーです。修正は次のとおりです。
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 . (==)