有没有更好的方式用无点符号表示绝对误差函数?

16

在点实际符号表示下:

absoluteError x y = abs (x-y)

一个不清楚的点无符号示例:

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


16
如果点记法很清楚,那有什么问题呢?这似乎是一个例子,在这种情况下,任何无点版本都必须通过脑力转换回来阅读。 - Ben
2个回答

33

以下是您可以按照小步骤自行推导的方法:

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

所以,通过 eta-约简,如果 f x y = g x y,我们可以得出结论 f = g
此外,暂时使用 _B = (.)
(abs .) . (-) = _B (abs .) (-) = _B (_B abs) (-) = (_B . _B) abs (-)
              = ((.) . (.)) abs (-)

1
之前的帮助和完美的答案再加一分。 - developer_hatch

26

以下是几种方法:

  1. 老派的写法:absoluteError = (abs .) . (-)
  2. 使用所谓的“boobs运算符”或“owl运算符”:absoluteError = ((.) . (.)) abs (-)
  3. 将“boobs运算符”命名为更符合政治正确的名称,并同时进行泛化。

    (.:) = fmap fmap fmap
    absoluteError = abs .: (-)
    
  4. 使用语义编辑器组合器

  5. result :: (o1 -> o2) -> (i -> o1) -> (i -> o2)
    result = (.)
    
    absoluteError = (result . result) abs (-)
    
    当然,这些都是同一种技巧,只是有不同的名称。享受吧!

1
为什么“.:”在任何标准中都没有被定义呢?或者它已经被定义了吗? - leftaroundabout
3
它在几个Hackage包中有定义,但它是如此微小的定义,以至于大多数人认为额外的依赖不值得花费精力。 - Daniel Wagner
@DanielWagner:是吗?我在任何地方都找不到它。 - Bergi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接