2012-06-13 12 views
16

En la notación pointful:¿Existe alguna forma mejor de expresar la función de error absoluto en la notación sin puntos?

absoluteError x y = abs (x-y)

Un ejemplo claro en notación pointfree:

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

+3

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

+15

Si está claro en notación puntiaguda, entonces, ¿qué tiene de malo? Esto parece el tipo de ejemplo en el que cualquier versión sin puntos va a tener que volverse a leer mentalmente de todos modos ... – Ben

Respuesta

33

Así es como se podría deducir por sí mismo, en pequeños pasos:

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

así, por eta-reduction, si llegamos a la conclusión f x y = g x yf = g.

Además, utilizando _B = (.) por un momento,

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

+1 muy pedagógico! – phg

+11

Operador de Boooobs FTW! – Landei

+0

Más uno para la ayuda anterior y la respuesta perfecta –

25

Aquí hay un puñado de maneras.

  1. la antigua usanza: absoluteError = (abs .) . (-)
  2. utilizan el llamado "operador tetas", o "operador buho" absoluteError = ((.) . (.)) abs (-)
  3. nombre del operador tetas algo más políticamente correcto (y qué diablos, generalizar que al mismo tiempo)

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

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

Por supuesto, estos son todos el mismo truco, solo que con diferentes nombres. ¡Disfrutar!

+1

¿Por qué no está '.:' Definido en cualquier parte estándar, de todos modos? ¿O es eso? – leftaroundabout

+3

@leftroundabout Se define en varios paquetes de hackage, pero es una definición tan pequeña que la mayoría de las personas no sienten que la dependencia adicional vale la pena el esfuerzo, creo. –

+0

+1 para 'fmap fmap fmap'. –

Cuestiones relacionadas