【问题标题】:If map or filter is used inside another function, does that function become higher order?如果 map 或 filter 在另一个函数中使用,该函数会变得更高阶吗?
【发布时间】:2012-02-07 22:22:27
【问题描述】:

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

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

removeSpaces 是高阶函数吗?

【问题讨论】:

    标签: haskell higher-order-functions


    【解决方案1】:

    不,removeSpaces 不是高阶函数。

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

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

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

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

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

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

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

    id :: a -> a
    

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

    【讨论】:

    • 是的,我点击了几次。显然我必须等待 3 分钟才能接受它。终于接受了.. :)
    • @Gihan 您可以在问题 15 分钟后接受答案,而不是在那之前。
    • 不知道(.) from Control.Category是否可以称为高阶。
    • @Rotsor:不;同样,(+) 不是高阶的,即使您可以将函数作为Num 的实例。某些实例(例如instance Category (->)确实具有更高阶的(.),但这是这些实例中定义的属性,而不是(.) 本身。
    • 如果函数返回一个函数,我想你可能还会考虑高阶函数。
    【解决方案2】:

    没有。高阶函数是将另一个函数作为参数的函数。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        您的 removeSpaces 函数两者都没有。

        【讨论】:

        • 作为结果返回另一个函数的函数不是高阶函数。任何 2 参数函数都具有该属性。
        • @dflemstr:我相信定义会有所不同。并不是说维基百科是权威的,但这是那里给出的定义,我想我已经在其他地方看到过它。根据这个定义,柯里化当然可以使更多的东西看起来像更高阶。
        猜你喜欢
        • 2011-12-13
        • 1970-01-01
        • 1970-01-01
        • 2014-12-19
        • 1970-01-01
        • 1970-01-01
        • 2014-11-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多