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