高阶函数

时间:2016-01-29 15:48:23

标签: haskell higher-order-functions

我正在尝试从此指南中了解更高阶函数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”这会产生类型为a的“HEY HAHA”,然后我需要应用f来获得“HEY HAHA HAHA”

编辑: 通过以下两个示例:(++ " HAHA")("HAHA " ++)

之间的区别是什么
ghci> applyTwice (++ " HAHA") "HEY"  
"HEY HAHA HAHA"  

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

3 个答案:

答案 0 :(得分:4)

(++ " HAHA")("HAHA " ++)之间的差异与传入参数的顺序有关。如果我们显式使用lambdas,表达式如下所示:

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

答案 1 :(得分:2)

  

(++ " HAHA")("HAHA " ++)之间的区别是什么?

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

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

答案 2 :(得分:2)

width: 100%;(++ "HAHA")

相同

,而

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

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