【发布时间】:2012-02-07 22:22:27
【问题描述】:
如果我在另一个函数中使用 map 或 filter,那个函数会变成高阶函数吗?例如:
removeSpaces :: String -> String
removeSpaces xs = filter (not . isSpace) xs
removeSpaces 是高阶函数吗?
【问题讨论】:
标签: haskell higher-order-functions
如果我在另一个函数中使用 map 或 filter,那个函数会变成高阶函数吗?例如:
removeSpaces :: String -> String
removeSpaces xs = filter (not . isSpace) xs
removeSpaces 是高阶函数吗?
【问题讨论】:
标签: haskell higher-order-functions
不,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] — 但它的类型并未声明它以任何函数作为参数:
id :: a -> a
在这种情况下,id 不是高阶。函数必须在其类型中显式地具有函数参数才能高阶。
【讨论】:
(.) from Control.Category是否可以称为高阶。
(+) 不是高阶的,即使您可以将函数作为Num 的实例。某些实例(例如instance Category (->))确实具有更高阶的(.),但这是这些实例中定义的属性,而不是(.) 本身。
没有。高阶函数是将另一个函数作为参数的函数。
经验法则:如果类型签名在括号中包含一个箭头,并且这些括号不在类型签名的末尾,例如:(... -> ...) -> ...,那么函数更高-顺序。
【讨论】:
不,高阶函数使用函数作为参数,例如map。
【讨论】:
不一定,在你的例子中也没有。
高阶函数是将函数作为参数或返回函数作为结果的函数。
您的 removeSpaces 函数两者都没有。
【讨论】: