Gih*_*han 1 haskell higher-order-functions
如果我在另一个函数中使用map或filter,那么该函数是否会成为一个高阶函数?例如:
removeSpaces :: String -> String
removeSpaces xs = filter (not . isSpace) xs
Run Code Online (Sandbox Code Playgroud)
是removeSpaces
一个更高阶的函数?
不,removeSpaces
不是高阶函数.
高阶函数是将函数作为参数的函数.removeSpaces
没有,所以事实并非如此.
高阶是函数接口的一个属性,而不是它的实现,所以我们可以removeSpaces
通过查看它的类型来判断它不是高阶:它不接受任何函数作为参数,所以它不是高阶.这是实现与使用高阶的功能,但是这完全是另一回事.
例如,filter
是一个高阶函数,因为它被声明为将函数作为参数:
filter :: (a -> Bool) -> [a] -> [a]
Run Code Online (Sandbox Code Playgroud)
但concat
事实并非如此,因为没有任何函数类型(a -> b
)作为参数:
concat :: [[a]] -> [a]
Run Code Online (Sandbox Code Playgroud)
多态性提出了一个棘手的边缘情况:你可以将函数传递给id
- id concat [[1, 2], [3, 4]]
是[1, 2, 3, 4]
- 但它的类型并没有将它声明为将任何函数作为参数:
id :: a -> a
Run Code Online (Sandbox Code Playgroud)
在这种情况下,id
是不是更高阶.函数必须在其类型中明确地具有函数参数才能更高阶.