Is there a better way to express the absolute error function in point-free notation?

为君一笑 提交于 2019-11-30 07:09:30

问题


In pointful notation:

absoluteError x y = abs (x-y)

An unclear example in pointfree notation:

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


回答1:


Here's how you could derive it yourself, in small steps:

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

so, by eta-reduction, if f x y = g x y we conclude f = g.

Further, using _B = (.) for a moment,

(abs .) . (-) = _B (abs .) (-) = _B (_B abs) (-) = (_B . _B) abs (-)
              = ((.) . (.)) abs (-)



回答2:


Here's a handful of ways.

  1. the old-fashioned: absoluteError = (abs .) . (-)
  2. use the so-called "boobs operator", or "owl operator" absoluteError = ((.) . (.)) abs (-)
  3. name the boobs operator something more politically correct (and what the heck, generalize it at the same time)

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

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

Of course, these are all the same trick, just with different names. Enjoy!



来源:https://stackoverflow.com/questions/11006772/is-there-a-better-way-to-express-the-absolute-error-function-in-point-free-notat

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!