有没有更好的方法来表达无点表示法的绝对误差函数?

Ben*_*ner 16 haskell pointfree

有点的表示法:

absoluteError x y = abs (x-y)

一个不明确的无点符号示例:

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

Wil*_*ess 33

以下是您可以通过小步骤自行推导出来的方法:

absoluteError x y = abs (x-y) = abs ((-) x y) = abs ( ((-) x) y) 
                  = (abs . (-) x) y = ( (abs .) ((-) x) ) y = 
                  = ( (abs .) . (-) ) x y
Run Code Online (Sandbox Code Playgroud)

所以,通过eta-reduction,如果f x y = g x y我们得出结论f = g.

进一步,_B = (.)暂时使用,

(abs .) . (-) = _B (abs .) (-) = _B (_B abs) (-) = (_B . _B) abs (-)
              = ((.) . (.)) abs (-)
Run Code Online (Sandbox Code Playgroud)

  • Boooobs-operator FTW! (11认同)

Dan*_*ner 26

这是一些方法.

  1. 老式的: absoluteError = (abs .) . (-)
  2. 使用所谓的"胸部操作员"或"猫头鹰操作员" absoluteError = ((.) . (.)) abs (-)
  3. 将胸部操作员命名为政治上更正确的东西(以及什么,同时概括它)

    (.:) = fmap fmap fmap
    absoluteError = abs .: (-)
    
    Run Code Online (Sandbox Code Playgroud)
  4. 使用语义编辑器组合器:

    result :: (o1 -> o2) -> (i -> o1) -> (i -> o2)
    result = (.)
    
    absoluteError = (result . result) abs (-)
    
    Run Code Online (Sandbox Code Playgroud)

当然,这些都是同样的伎俩,只是名字不同.请享用!

  • @leftroundabout它是在几个hackage包中定义的,但它是如此微小的定义,大多数人不觉得额外的依赖是值得的努力,我想. (3认同)