Haskell中的高阶函数

时间:2012-02-08 04:07:23

标签: haskell

我写了以下代码。我知道更高阶函数是一个函数,它接受另一个函数并返回一个函数作为结果。但是,如果函数是高阶,我就无法清楚地区分它。 sort是一个更高阶的函数吗?如何确定函数是否为高阶函数?

sortString :: String -> [String]
sortString x = sort (convertStringIntoList x)

2 个答案:

答案 0 :(得分:6)

高阶函数是一个函数,它将另一个函数作为参数,作为结果产生另一个函数,或者两者兼而有之。

你的问题中的函数有一个参数,它是一个字符串,而不是一个函数。应用时,函数的值是一个字符串数组,而不是函数。因此,这是一项普通的功能。

更高阶的类似功能是

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允许我们按降序而不是按升序对列表进行排序。

答案 1 :(得分:2)

如果sort接受输入convertStringIntoList和x,那么它是更高阶。 如果x首先由convertStringIntoList执行,那么通过sort,则sort不是更高阶函数(函数只是嵌套)。

基于排序的输入和输出类型(http://zvon.org/other/haskell/Outputlist/sort_f.html)我会说它是第一个。 (另外,根据格式化的方式,必须如此。) 类型定义Ord a => [a] - > [a]表示该函数采用“a”列表并返回“a”列表,其中a是类“Ord”的类型。基本上这只意味着它可以是Char,Double,Float,Int或Integer(http://zvon.org/other/haskell/Outputprelude/Ord_c.html)。所以输入不能是一个功能。

通常,您可以通过查找其输入和输出类型是什么来查明函数是否为更高阶。如果其中任何一个都可以是函数,那么函数可以是更高阶函数。

如果输入可能是也可能不是函数,则可能会有一些灰色区域。例如,假设你有一个接受输入的函数并且只返回相同的输出(没有意义,但它只是一个例子)。然后我会说,如果你使用一个字符作为输入,它将不会作为一个更高阶函数,但如果你使用一个函数作为输入,那么它会。但不确定那部分,只是我的直觉。