13

虽然我对数学意义上的柯里化有点了解,但部分应用中缀函数是一个新概念,这是我在深入阅读《Learn You a Haskell for Great Good 》一书后发现的。

鉴于此功能:

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 对中缀切片有什么特殊处理吗?它对所有中缀函数都是通用的吗?


作为旁注,这是我学习 Haskell 和函数式编程的第一周,我仍在阅读这本书。

4

3 回答 3

19

是的,您可以通过指定其左操作数或右操作数来部分应用中缀运算符,而将另一个留空(正是在您编写的两个示例中)。

因此,与或([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
于 2012-04-12T20:37:48.043 回答
16

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

部分写为( op e )or ( e op ),其中 op 是二元运算符, e 是表达式。部分是二元运算符部分应用的便捷语法。

以下身份持有:

(op e)  =   \ x -> x op e
(e op)  =   \ x -> e op x
于 2012-04-12T20:38:24.113 回答
5

所有中缀运算符都可以在 Haskell 的部分中使用 - 除了-由于一元否定的奇怪性。这甚至包括通过使用反引号转换为中缀的非中缀函数。您甚至可以将运算符转换为普通函数的公式视为双面部分:

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

部分(大多数情况下,有一些罕见的极端情况)被视为简单的 lambda。(/ 2)是相同的:

\x -> (x / 2)

(2 /)相同\x -> (2 / x),例如使用非交换运算符。

从理论上讲,这里没有什么非常有趣的事情。它只是部分应用中缀运算符的语法糖。它经常使代码更漂亮一点。(当然也有反例。)

于 2012-04-12T20:38:16.563 回答