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