【问题标题】:Higher Order Functions高阶函数
【发布时间】:2016-05-07 10:09:33
【问题描述】:

我正在尝试从http://learnyouahaskell.com/higher-order-functions 的本指南中了解高阶函数。但我有点困惑,希望有人能帮我澄清一些事情。

所以我在看这个例子:

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

好的,所以applyTwice 是一个接受两个参数的函数,一个接受类型a 和返回类型a 的函数,第二个参数是一个类型a。并且该函数返回一个类型a。

在命令行中我们得到了这个结果:

ghci> applyTwice (++ " HAHA") "HEY"  
"HEY HAHA HAHA" 

所以函数f是(++),它的类型是[a] -> [a] -> [a]。 (++ " HAHA") 部分申请正确吗?我们只给了它一个参数,所以它返回[a] -> [a]。 在applyTwice 定义中,我想从(f x) 部分开始。所以 f 取 "HEY" 这会产生 "HEY HAHA" 类型为a,然后我需要申请 f 来获得 "HEY HAHA HAHA"

编辑: 用这两个例子:(++ " HAHA")和("HAHA " ++)有什么区别

ghci> applyTwice (++ " HAHA") "HEY"  
"HEY HAHA HAHA"  

ghci> applyTwice ("HAHA " ++) "HEY"  
"HAHA HAHA HEY" 

【问题讨论】:

  • 听起来你已经掌握了它的基本要点。您有具体问题吗?
  • (++ " HAHA") 实际上是 section 但除此之外,您的理解看起来是正确的。你有什么问题?

标签: haskell higher-order-functions


【解决方案1】:

(++ " HAHA") 和("HAHA " ++) 的区别在于传入参数的顺序。如果我们显式使用 lambda,表达式如下所示:

(++ " HAHA") == (\x -> x ++ " HAHA") -- expands to: "HEY" ++ " HAHA"
("HAHA " ++) == (\x -> "HAHA " ++ x) -- expands to: "HAHA " ++ "HEY"

【讨论】:

    【解决方案2】:

    (++ " HAHA") 和 ("HAHA " ++) 有什么区别?

    (++ " HAHA") 将" HAHA" 作为(++) 函数的第二个参数。

    ("HAHA " ++) 将"HAHA " 作为(++) 函数的第一个参数。

    【讨论】:

      【解决方案3】:

      (++ "HAHA") 与(\x -> x ++ "HAHA") 相同

      而

      ("HAHA" ++) 等于 (\x -> "HAHA" ++ x)

      这在您的测试中也很明显。这种语法称为section,它使(非交换)二元运算符的部分应用更容易和更直观。

      【讨论】:

        猜你喜欢
        • 2017-04-21
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        相关资源
        最近更新 更多