2012-06-13 7 views
16

:pointfree表記で絶対誤差関数をポイントフリーの表​​記法で表現するより良い方法はありますか?好い加減な表記で

absoluteError x y = abs (x-y)

不明確例:

absoluteError' = curry (abs . uncurry (-))

+3

_B = (.)を使用。 ( - ) ' – Vitus

+15

もしそれが明白であれば、何が間違っていますか?これは、ポイントフリーのバージョンが精神的に元に戻って読まれなければならないような例のようです... – Ben

答えて

33

あなたは小さなステップで、それを自分で導き出すことができる方法だ:そう

absoluteError x y = abs (x-y) = abs ((-) x y) = abs (((-) x) y) 
        = (abs . (-) x) y = ((abs .) ((-) x)) y = 
        = ((abs .) . (-)) x y 

eta-reductionにより、f x y = g x y場合我々はf = gを締結します。

また、(絶対) `、しばらく

(abs .) . (-) = _B (abs .) (-) = _B (_B abs) (-) = (_B . _B) abs (-) 
       = ((.) . (.)) abs (-) 
+2

+1非常に教育的! – phg

+11

ブーイングオペレーターFTW! – Landei

+0

前のヘルプと完璧な回答のためのプラスもう一つ –

25

は、ここでの方法の一握りです。

  1. 昔ながら:absoluteError = (abs .) . (-)
  2. は、いわゆる「おっぱい演算子」を使用、または「フクロウの演算子」absoluteError = ((.) . (.)) abs (-)
  3. 名前おっぱい演算子より政治的に正しい(と一体何何か、一般化同時にそれ)semantic editor combinatorsを使用して

    (.:) = fmap fmap fmap 
    absoluteError = abs .: (-) 
    
  4. result :: (o1 -> o2) -> (i -> o1) -> (i -> o2) 
    result = (.) 
    
    absoluteError = (result . result) abs (-) 
    

もちろん、これはまったく同じトリックであり、名前が違うだけです。楽しい!ここで

+1

なぜ、 '。:'は標準のどこにも定義されていませんか?またはそれは? – leftaroundabout

+3

@leftroundaboutそれはいくつかのハッカーパッケージで定義されていますが、ほとんどの人が余分な依存性が努力する価値があるとは思わないほど小さい定義です。 –

+0

+1 'fmap fmap fmap'の場合+1です。 –

関連する問題