我写了以下代码。我知道高阶函数是一个接受另一个函数并返回一个函数作为结果的函数。但是我不能清楚地区分一个函数是不是高阶的。sort是高阶函数吗?如何判断一个函数是否为高阶函数?
sortString :: String -> [String]
sortString x = sort (convertStringIntoList x)发布于 2012-02-08 12:21:53
高阶函数是以另一个函数作为参数,产生另一个函数作为结果的函数,或者两者兼而有之。
问题中的函数有一个参数,它是一个字符串,而不是一个函数。应用时,函数的值是字符串数组,而不是函数。因此,它是一个普通的函数。
一个类似的高阶函数是
sortString :: (Char -> Char -> Ordering) -> String -> [String]
sortString cmp s = map (:[]) $ sortBy cmp s高阶函数的强大之处在于它们提供的灵活性。提供不同的函数会产生不同的结果:
ghci> sortString compare "slkdjfs"
["d","f","j","k","l","s","s"]
ghci> sortString (flip compare) "slkdjfs"
["s","s","l","k","j","f","d"]如果您不熟悉,compare提供了一个与其参数相关的Ordering,例如,
ghci> compare 'a' 'b'
LT
ghci> compare 'b' 'a'
GT正如您可能已经注意到的,flip本身是另一个高阶函数,它将参数重新排序或反转到另一个函数。使用上面代码中的flip可以让我们按降序而不是升序对列表进行排序。
发布于 2012-02-08 12:22:07
如果sort接受输入convertStringIntoList和x,那么它是高阶的。如果x首先由convertStringIntoList操作,然后按sort操作,那么sort就不是高阶函数(这些函数只是嵌套的)。
根据sort的输入和输出类型(http://zvon.org/other/haskell/Outputlist/sort_f.html),我认为它是第一个。(此外,根据格式化的方式,必须是这种情况。)类型定义Ord a => a -> a意味着函数接受"a“的列表并返回"a”的列表,其中a是类"Ord“的类型。基本上,这只是意味着它可以是字符、双精度、浮点型、整型或整型(http://zvon.org/other/haskell/Outputprelude/Ord_c.html)。所以输入不能是函数。
通常,您可以通过查找函数的输入和输出类型来确定该函数是否为高阶函数。如果这两个函数中的任何一个都可以是函数,则该函数可以是更高阶的函数。
如果输入可能是函数,也可能不是函数,那么您可能会有一些灰色地带。例如,假设您有一个函数,它接受一个输入,然后返回相同的输出(没有意义,但这只是一个示例)。然后我会说,如果你使用一个字符作为输入,它就不会作为一个高阶函数,但如果你使用一个函数作为输入,那么它就会。这一点我不太确定,只是我的直觉。
https://stackoverflow.com/questions/9187732
复制相似问题