演習として、プレリュードの興味深い部分を手動で実装しようとしています。ポイントフリーになる機会を見つけたときはいつでもそれを取ります。しかし、これは私を最もありそうもない場所のレンガの壁に導きました。このコードの使用:
myelem _ [] = False
myelem x y = if x == head y then True else myelem x (tail y)
を実装しようとしていますnotElem
。これが私の試みです:
-- First
mynotelem = not myelem
タイプが一致しないため、当然のことながら爆発します。これは簡単に修正できます。
-- Second
mynotelem x y = not (myelem x y)
ただし、引数xとyの明示的な宣言は醜く不必要に感じるので、ポイントフリースタイルに戻そうとしています。
-- Third
mynotelem = not $ myelem
失敗する
Couldn't match expected type `Bool'
with actual type `a0 -> [a0] -> Bool'
In the second argument of `($)', namely `myelem'
In the expression: not $ myelem
In an equation for `mynotelem': mynotelem = not $ myelem
十分に公平ですが、タイプはまだ一致していません。しかし、どのように修正しますか?再びあなたはまっすぐにジャンプすることができます
-- Fourth
mynotelem x y = not $ myelem x y
これは機能しますが、危険なほど円を描くことに近いようです。私は、議論の1つを排除することが可能であることを発見しました:
-- Fifth
mynotelem x = not . (myelem x)
しかし、その厄介なxはまだ残っています。どうすればそれを排除できますか?