gpt4 book ai didi

haskell - 带中缀符号的无点样式

转载 作者:行者123 更新时间:2023-12-02 08:06:35 25 4
gpt4 key购买 nike

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

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) `+`

你不能像 e.g 那样以无点风格组合运算符吗?

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

我的意思是你可以砍掉像 fold 这样的函数的参数,但为什么不能去掉操作符的参数呢?

最佳答案

既然你需要传递两个参数,我们可以使用所谓的“surprised owl operator”。这基本上是参数的组合。所以我们可以使用:

f = <b>((.).(.))</b> (+) (+)

或者我们可以更内联操作符,例如:

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

猫头鹰运算符 ((.).(.)) f g 基本上是 \x y -> f (g x y)

的缩写

这是如何工作的?

surprise owl operator”的规范形式是:

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

所以我们现在可以用相应的 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)

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

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 (+) (+)

所以:

f x y = (+) ((+) x y)

关于haskell - 带中缀符号的无点样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50852498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com