带中缀表示法的点自由样式

2024-03-02

您好,有没有办法在使用中缀表示法时编写点自由样式?

f::Int->Int->Int->Int
f a b=(+) (a+b)

为什么你不能做这样的事情?

 f::Int->Int->Int->Int
 f a b=(a+b) +

      or

 f a b= (a+b) `+`

您不能像例如这样以点自由风格组合运算符吗?

ptfree::Int->Int->Int->Int
ptfree=(+) (+)

我的意思是你可以砍掉函数的参数,比如fold但为什么不用于运算符参数呢?


好吧,既然你需要通过two参数,我们可以使用所谓的“惊讶的猫头鹰操作员”。这基本上是参数的组合。所以我们可以使用:

f = ((.).(.)) (+) (+)

或者我们可以更内联运算符,例如:

f = ((+) .) . (+)

猫头鹰操作员((.).(.)) f g基本上是缩写\x y -> f (g x y)

这是如何运作的?

“的规范形式惊讶的猫头鹰操作员" is:

= ((.) . (.))
------------- (canonical form)
  (.) (.) (.)

所以我们现在可以替换(.)s 与相应的 lambda 表达式:

(\f g x -> f (g x)) (.) (.)

现在我们可以进行一些替换:

   (\f g x -> f (g x)) (.) (.)
-> (\x -> (.) ((.) x))
-> (\x -> (\q r y -> q (r y)) ((.) x))
-> (\x -> (\r y -> ((.) x) (r y)))
-> (\x r y -> ((.) x) (r y))
-> (\x r y -> ((\s t u -> s (t u)) x) (r y))
-> (\x r y -> (\t u -> x (t u)) (r y))
-> (\x r y -> (\u -> x ((r y) u)))
-> \x r y u -> x ((r y) u))
-> \x r y u -> x (r y u)

所以基本上这意味着我们惊讶的猫头鹰运算符等于:

surprised_owl :: (y -> z) -> (a -> b -> y) -> a -> b -> z
surprised_owl f g x y = f (g x y)  -- renamed variables

如果我们现在用提供的函数专门化它(两次(+)),我们得到:

f = surprised_owl (+) (+)

so:

f x y = (+) ((+) x y)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带中缀表示法的点自由样式 的相关文章

随机推荐