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

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一个更高阶的函数?

ehi*_*ird 6

不,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不是更高阶.函数必须在其类型中明确地具有函数参数才能更高阶.