与中缀函数部分应用程序(Partial Application with Infix Functio

2019-07-28 23:08发布

虽然我了解一些柯里在数学意义上,部分应用中缀函数是一个新的概念后,在深入的书,我发现了解你的好大一个Haskell

鉴于这一功能:

applyTwice :: (a -> a) -> a -> a
applyTwice f x = f (f x)

笔者使用它在一个有趣的方式:

ghci> applyTwice (++ [0]) [1]  
[1,0,0]
ghci> applyTwice ([0] ++) [1]
[0,0,1]

在这里,我可以清楚地看到所产生的功能有不同的参数传递,这不会以正常方式考虑到它是一个咖喱功能发生(不是吗?)。 那么,有没有通过哈斯克尔上缀切片任何特殊待遇? 它是通用于所有中缀的功能呢?


作为一个方面说明,这是我的第一个星期Haskell和函数式编程,我还在读的书。

Answer 1:

是的,你可以部分通过指定其左侧或右侧的操作数,只留下另一个空白(恰好你写的两个例子)应用中缀运算符。

所以, ([0] ++)是一样的(++) [0]\x -> [0] ++ x (记住可以通过括号来转中缀运算符到一个标准的功能),而(++ [0])等于\x -> x ++ [0]

它也知道反引号的使用是有用的,(``),使您能够将任何标准功能方面与中缀操作两个参数:

Prelude> elem 2 [1,2,3]
True
Prelude> 2 `elem` [1,2,3] -- this is the same as before
True
Prelude> let f = (`elem` [1,2,3]) -- partial application, second operand
Prelude> f 1
True
Prelude> f 4
False
Prelude> let g = (1 `elem`) -- partial application, first operand
Prelude> g [1,2]
True
Prelude> g [2,3]
False


Answer 2:

是的,这部分语法的工作。

部分被写为( op e )( e op )其中op是一个二进制运算符和e是一个表达式。 部分是用于二元操作的局部应用方便的语法。

下列身份持有:

(op e)  =   \ x -> x op e
(e op)  =   \ x -> e op x


Answer 3:

所有缀运营商可以在部分使用哈斯克尔-除了-由于与目负陌生感。 这甚至包括转换通过使用反引号来缀非缀功能。 你甚至可以把配方制造商到正常功能作为一个双面部分组成:

(x + y) - > (+ y) - > (+)

部分是(主要是,一些罕见的极端情况)一样简单lambda表达式处理。 (/ 2)是相同的:

\x -> (x / 2)

(2 /)是一样的\x -> (2 / x)用于具有非可交换操作符的例子。

没有什么深刻有趣理论上会在这里。 这只是中缀运营商的部分应用程序的语法糖。 这使得代码有点漂亮,经常。 (有反例,当然)。



文章来源: Partial Application with Infix Functions