我正在尝试从此指南中了解更高阶函数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"
答案 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 ,使(非交换)二元运算符的部分应用更容易,更直观。