2011-12-28 10 views
2

練習として、私はプレリュードの興味深い部分を手動で実装しようとしています。ポイントフリーになる機会が見つかるたびに私はそれを取る。しかし、これは私を最も恐ろしい場所のレンガの壁に導いてしまった。このコードを使用する:関数ポイントを書き込もうとしていませんが、GHCIは承認しません

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の明示的な宣言は、醜い、不要な感じしかし、私は戻ってポイント自由なスタイルにそれを取得しよう。

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 

十分なフェアで失敗

-- Third 
mynotelem = not $ myelem 

、種類がまだ一致しません。しかし、どうやってそれを修正するのですか?再びあなたはすぐにジャンプすることができます

-- Fourth 
mynotelem x y = not $ myelem x y 

これはうまくいきますが、ちょうど円に近づくように近いです。私は、引数の1つを削除することができることを発見しました:しかし、厄介なxはまだ残っています。どうすればそれを排除できますか?

+2

ThelronKnuckle:あなたの避難所であれば複数の引数については

mynotelem = ((.).(.)) not myelem 

、パターンは次のように続けます'($)'と '(。) 'の違いに関するSOの質問を検索してください - これらの質問/回答が役立つと思います。 –

答えて

12

私たちは、このようなあなたのコードを書き換えることができます。

mynotelem x = not . (myelem x) 
      = (not .) (myelem x) 

は今、これは単なるh x = f (g x)f = (not .)g = myelemであることを認識し、私たちはそれがポイントフリーh = f . gとして(.)オペレータの別の使用と書くことができます。

mynotelem = (not .) . myelem 

以上の引数を持つ関数を構成する際に、パターンが続くか注:

> let f x y z = x+y+z 
> (((sqrt .) .) . f) 1 2 3 
2.449489742783178 

また、あなたはまた、組成物のオペレータのこの変に見える組成物とそれを書くことができます。

> ((.).(.).(.)) sqrt f 1 2 3 
2.449489742783178 
+3

恥知らずなプラグイン、私はハックするための "組成"パッケージをアップロードし、おしゃぶりのオペレーターや友人のための便利な機能を提供しました。 –

+3

おしゃぶりのオペレーターXDは、私の仲間にhaskellをポンピングするとき、それを有利に使用しなければならないでしょう – TheIronKnuckle

+0

実際のコードで "boob operator"を使うのは普通ですか?このような状況を処理する最もクリーンな方法は何ですか?ポイントを置いておく方が良いでしょうか( 'mynotelem x = not elem x'または' mynotelem x y = not $ elem x y')? –

関連する問題