【问题标题】:Is there a better way to express the absolute error function in point-free notation?有没有更好的方法来用无点表示法表达绝对误差函数?
【发布时间】:2012-06-13 00:38:35
【问题描述】:

用点符号表示:

absoluteError x y = abs (x-y)

一个不明确的无点表示法示例:

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

【问题讨论】:

  • 如果用尖锐的符号很清楚,那有什么问题呢?这看起来像是那种必须通过心理转换来阅读任何无点版本的示例......

标签: haskell pointfree


【解决方案1】:

您可以通过以下小步骤自行推导出它:

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

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

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

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

【讨论】:

  • 加一为以前的帮助和完美的答案
【解决方案2】:

这里有一些方法。

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

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

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

当然,这些都是一样的把戏,只是名字不同而已。享受吧!

【讨论】:

  • 为什么.: 没有在任何地方定义为标准?还是这样?
  • @leftroundabout 它在几个 hackage 包中都有定义,但它的定义太小了,我认为大多数人不觉得额外的依赖值得付出努力。
  • @DanielWagner:是吗?我在任何地方都找不到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-22
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 2023-03-27
相关资源
最近更新 更多