如果我在另一个函数中使用map或filter,那么该函数是否会成为一个高阶函数?例如:
removeSpaces :: String -> String
removeSpaces xs = filter (not . isSpace) xs
removeSpaces
是高阶函数吗?
答案 0 :(得分:6)
不,removeSpaces
不是高阶函数。
高阶函数是将函数作为参数的函数。 removeSpaces
没有,所以不是。
高阶是函数接口的属性,而不是它的实现,所以我们可以通过查看它的类型来判断removeSpaces
不是高阶:它不会将任何函数作为参数,所以它不是高阶。使用更高阶函数实现,但这完全是另一回事。
例如,filter
是一个高阶函数,因为它被声明为将函数作为参数:
filter :: (a -> Bool) -> [a] -> [a]
但是concat
不是,因为没有任何函数类型(a -> b
)作为参数:
concat :: [[a]] -> [a]
多态性带来了一个棘手的边缘情况:你可以将函数传递给id
- id concat [[1, 2], [3, 4]]
是[1, 2, 3, 4]
- 但它的类型并没有将它声明为将任何函数作为参数:< / p>
id :: a -> a
在这种情况下,id
不更高阶。函数必须在其类型中明确地具有函数参数,以使其更高阶。
答案 1 :(得分:3)
没有。高阶函数是将另一个函数作为参数的函数。
经验法则:如果类型签名在parens中包含箭头,并且那些parens不在类型签名的末尾,如下所示:(... -> ...) -> ...
,则函数是高阶。
答案 2 :(得分:0)
nope,高阶函数使用函数作为参数,例如map
。
答案 3 :(得分:0)
不一定,而不是你的例子。
高阶函数是一个函数,它将函数作为参数或作为结果返回函数。
您的removeSpaces
功能既没有。