2012-06-13 11 views
16

Nella notazione pointful:Esiste un modo migliore per esprimere la funzione di errore assoluto nella notazione point-free?

absoluteError x y = abs (x-y)

Un esempio chiaro in notazione pointfree:

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

+3

'(ass.). (-) ' – Vitus

+15

Se è chiaro nella notazione a punta, allora cosa c'è di sbagliato in esso? Questo sembra il tipo di esempio in cui qualsiasi versione point-free deve essere letta convertendo mentalmente indietro comunque ... – Ben

risposta

33

Ecco come si potrebbe ricavare da soli, a piccoli passi:

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

così, da eta-reduction, se f x y = g x y concludiamo f = g.

Inoltre, utilizzando _B = (.) per un momento,

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

+1 molto pedagogico! – phg

+11

Operatore Boooobs FTW! – Landei

+0

Più uno per l'aiuto precedente e la risposta perfetta –

25

Ecco una manciata di modi.

  1. il vecchio stile: absoluteError = (abs .) . (-)
  2. utilizzare il cosiddetto "operatore tette", o "operatore civetta" absoluteError = ((.) . (.)) abs (-)
  3. nome dell'operatore tette qualcosa di più politicamente corretto (e che diamine, generalizzare allo stesso tempo)

    (.:) = fmap fmap fmap 
    absoluteError = abs .: (-) 
    
  4. usando semantic editor combinators:

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

Naturalmente, questi sono tutti lo stesso trucco, solo con nomi diversi. Godere!

+1

Perché non è '.:' Definito ovunque standard, comunque? O è? – leftaroundabout

+3

@leftroundabout È definito in diversi pacchetti di hackage, ma è una definizione così minuscola che la maggior parte delle persone non ritiene che la dipendenza extra valga la pena, credo. –

+0

+1 per 'fmap fmap fmap'. –

Problemi correlati