如果在另一个函数中使用了map或filter,那么该函数会变成更高阶吗?

时间:2012-02-07 22:22:27

标签: haskell higher-order-functions

如果我在另一个函数中使用map或filter,那么该函数是否会成为一个高阶函数?例如:

removeSpaces :: String -> String 
removeSpaces xs = filter (not . isSpace) xs 

removeSpaces是高阶函数吗?

4 个答案:

答案 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功能既没有。