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 (-))
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 (-))
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 y
f = g
.
Además, utilizando _B = (.)
por un momento,
(abs .) . (-) = _B (abs .) (-) = _B (_B abs) (-) = (_B . _B) abs (-)
= ((.) . (.)) abs (-)
Aquí hay un puñado de maneras.
absoluteError = (abs .) . (-)
absoluteError = ((.) . (.)) abs (-)
nombre del operador tetas algo más políticamente correcto (y qué diablos, generalizar que al mismo tiempo)
(.:) = fmap fmap fmap
absoluteError = abs .: (-)
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!
¿Por qué no está '.:' Definido en cualquier parte estándar, de todos modos? ¿O es eso? – leftaroundabout
@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. –
+1 para 'fmap fmap fmap'. –
'(abs.). (-) ' – Vitus
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