【问题标题】:Partial Application with Infix Functions带中缀函数的部分应用
【发布时间】:2012-04-25 06:07:18
【问题描述】:

虽然我对数学意义上的柯里化有点了解,但部分 应用中缀函数是我潜水后发现的一个新概念 入书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 functional-programming currying partial-application operator-sections


    【解决方案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
    

    【讨论】:

    • 所以,我不知道 Haskell,但 (1 `elem`)elem 1 一样吗?
    • 我喜欢将(++) 视为省略两个输入的部分。
    【解决方案2】:

    是的,这是the section syntax 在工作。

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

    以下身份持有:

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

    【讨论】:

      【解决方案3】:

      所有中缀运算符都可以在 Haskell 的部分中使用 - 除了-,因为它具有一元否定的奇怪性。这甚至包括通过使用反引号转换为中缀的非中缀函数。你甚至可以把将运算符变成普通函数的公式看成一个双面部分:

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

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

      \x -> (x / 2)

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

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

      【讨论】:

      • 请注意,“一元否定的奇怪之处”是由于 (- 1) 应该被解释为数字文字 -1 还是函数 \x -> x - 1 是模棱两可的。 Haskell 的创建者的选择是将其解释为数字文字,并提供满足subtract x = \y -> y - x 的函数subtract。他们还提供negate,它充当一元减函数,即negate x = -x
      • @ChrisTaylor:差不多。 (- x) 转换为 negate x,所以 (- 1)negate (fromInteger 1),而不是 fromInteger (-1)。当然,对于行为良好的Num 实例,两者应该是等价的。
      • @hammar 好吧,这里有点倒退逻辑。谢谢指正!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多