高阶函数

Higher Order Functions

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

所以我正在看这个例子:

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

Ok 所以 applyTwice 是一个接受两个参数的函数,一个接受类型 a 和 return 类型 a 的函数,第二个参数是一个类型a。而函数 return 是一个类型 a.

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

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

所以函数f(++),它的类型是[a] -> [a] -> [a](++ " HAHA") 部分应用是否正确?我们只给了它一个参数,所以它 returns [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" 

What is the difference between (++ " HAHA") and ("HAHA " ++)?

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

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

(++ " HAHA")("HAHA " ++) 之间的区别与参数传递的顺序有关。如果我们显式使用 lambda,则表达式如下所示:

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

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

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

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