2012-06-13 5 views
16

W notacji pointful:Czy istnieje lepszy sposób na wyrażenie bezwzględnej funkcji błędu w notacji bez punktu?

absoluteError x y = abs (x-y)

Niejasna przykład w notacji pointfree:

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

+3

'(abs.). (-) ' – Vitus

+15

Jeśli jest jasne w spiczastym zapisie, to co jest z nim nie tak? To wygląda na taki przykład, w którym dowolna wersja bez punktu będzie musiała być odczytana przez konwersję mentalną tak czy inaczej ... – Ben

Odpowiedz

33

Oto jak można to wywodzą się w małych krokach:

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

tak, by eta-reduction, jeśli f x y = g x y wnioskujemy f = g.

Ponadto, korzystając _B = (.) Przez chwilę

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

+1 bardzo pedagogiczny! – phg

+11

Boooobs-operator FTW! – Landei

+0

Plus za poprzednią pomoc i idealną odpowiedź –

25

Oto kilka sposobów.

  1. staromodny: absoluteError = (abs .) . (-)
  2. użyć tzw "operator boobs" lub "operator sowa" absoluteError = ((.) . (.)) abs (-)
  3. nazwą coś bardziej politycznie poprawny operator cycki (i co do cholery, uogólniać to w tym samym czasie)

    (.:) = fmap fmap fmap 
    absoluteError = abs .: (-) 
    
  4. użyciu semantic editor combinators:

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

Oczywiście są to te same sztuczki, tylko z różnymi nazwami. Cieszyć się!

+1

Dlaczego tak czy inaczej nigdzie nie jest zdefiniowane '.:'? Albo to jest? – leftaroundabout

+3

@leftroundabout Jest to zdefiniowane w kilku pakietach hackage, ale jest to tak mała definicja, że ​​większość ludzi nie uważa, że ​​dodatkowa zależność jest warta wysiłku, jak sądzę. –

+0

+1 dla 'fmap fmap fmap'. –

Powiązane problemy