1

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

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

removeSpaces高阶函数吗?

4

4 回答 4

6

不,removeSpaces不是高阶函数。

高阶函数是将函数作为参数的函数。removeSpaces没有,所以不是。

高阶是函数接口的属性,而不是它的实现,所以我们可以removeSpaces通过查看它的类型来判断它不是高阶的:它不接受任何函数作为参数,所以它不是高阶的。它是通过使用高阶函数来实现的,但这完全是另一回事。

例如,filter是一个高阶函数,因为它被声明为以函数为参数:

filter :: (a -> Bool) -> [a] -> [a]

concat不是,因为没有任何函数类型 ( a -> b) 作为参数:

concat :: [[a]] -> [a]

多态性提出了一个棘手的极端情况:您可以将一个函数传递给idid concat [[1, 2], [3, 4]]is [1, 2, 3, 4]— 但它的类型并没有将其声明为将任何函数作为参数:

id :: a -> a

在这种情况下,不是id高阶。函数必须在其类型中显式地具有函数参数才能是高阶的。

于 2012-02-07T22:27:48.917 回答
3

不可以。高阶函数是将另一个函数作为参数的函数。

经验法则:如果类型签名在括号中包含一个箭头,并且这些括号不在类型签名的末尾,例如:(... -> ...) -> ...那么函数是高阶的。

于 2012-02-07T22:28:22.587 回答
0

不,高阶函数使用函数作为参数map,例如。

于 2012-02-07T22:27:40.880 回答
0

不一定,在你的例子中也没有。

高阶函数是将函数作为参数或返回函数作为结果的函数。

您的removeSpaces功能也没有。

于 2012-02-07T22:28:33.593 回答