haskell - tipos - medidas indirectas
¿Hay una mejor manera de expresar la función de error absoluto en notación sin puntos? (2)
En notación puntual:
absoluteError xy = abs (xy)
Un ejemplo poco claro en notación de punto libre:
absoluteError'' = curry (abs . uncurry (-))
Aquí hay un puñado de maneras.
- la antigua:
absoluteError = (abs .) . (-)
absoluteError = (abs .) . (-)
- use el llamado "operador de tetas", o "operador de búho"
absoluteError = ((.) . (.)) abs (-)
nombrar al operador de las tetas algo más políticamente correcto (y qué diablos, generalizarlo al mismo tiempo)
(.:) = fmap fmap fmap absoluteError = abs .: (-)
utilizando combinadores de editor semántico :
result :: (o1 -> o2) -> (i -> o1) -> (i -> o2) result = (.) absoluteError = (result . result) abs (-)
Por supuesto, estos son todos el mismo truco, solo que con nombres diferentes. ¡Disfrutar!
Así es como podría derivarlo usted 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
entonces, por eta-reduction , si fxy = gxy
concluimos f = g
.
Además, usando _B = (.)
Por un momento,
(abs .) . (-) = _B (abs .) (-) = _B (_B abs) (-) = (_B . _B) abs (-)
= ((.) . (.)) abs (-)