虽然我了解一些柯里在数学意义上,部分应用中缀函数是一个新的概念后,在深入的书,我发现了解你的好大一个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和函数式编程,我还在读的书。
是的,你可以部分通过指定其左侧或右侧的操作数,只留下另一个空白(恰好你写的两个例子)应用中缀运算符。
所以, ([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
是的,这部分语法的工作。
部分被写为( op e )
或( e op )
其中op是一个二进制运算符和e是一个表达式。 部分是用于二元操作的局部应用方便的语法。
下列身份持有:
(op e) = \ x -> x op e
(e op) = \ x -> e op x
所有缀运营商可以在部分使用哈斯克尔-除了-
由于与目负陌生感。 这甚至包括转换通过使用反引号来缀非缀功能。 你甚至可以把配方制造商到正常功能作为一个双面部分组成:
(x + y)
- > (+ y)
- > (+)
部分是(主要是,一些罕见的极端情况)一样简单lambda表达式处理。 (/ 2)
是相同的:
\x -> (x / 2)
和(2 /)
是一样的\x -> (2 / x)
用于具有非可交换操作符的例子。
没有什么深刻有趣理论上会在这里。 这只是中缀运营商的部分应用程序的语法糖。 这使得代码有点漂亮,经常。 (有反例,当然)。