Haskell中的高阶函数

Haskell中的高阶函数,haskell,Haskell,我已经编写了以下代码。我知道高阶函数是一个函数,它接受另一个函数并返回一个函数作为结果。但是我不能清楚地区分一个函数是否是高阶的。sort是高阶函数吗?如何确定函数是否为高阶函数 sortString :: String -> [String] sortString x = sort (convertStringIntoList x) 高阶函数是将另一个函数作为参数,生成另一个函数作为结果,或者两者兼而有之的函数 问题中的函数只有一个参数是字符串,而不是函数。应用时,函数的值是字符串数组

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

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

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

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

类似的高阶函数是

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
提供与其参数相关的
排序,例如


您可能已经注意到,
flip
本身就是另一个高阶函数,它将参数重新排序或翻转到另一个函数。在上面的代码中使用
flip
,我们可以按降序而不是升序对列表进行排序。

如果排序采用StringIntoList和x的输入,则其顺序更高。 如果x首先由ConvertStringToList操作,然后由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). 因此,输入不能是函数

通常,通过查找函数的输入和输出类型,可以确定函数的阶数是否较高。如果其中任何一个可以是函数,则该函数可以是高阶函数


如果输入可能是函数,也可能不是函数,则可能会有一点灰色区域。例如,假设您有一个函数,它接受一个输入并返回相同的输出(毫无意义,但这只是一个示例)。然后我会说,如果你使用一个字符作为输入,它不会作为一个高阶函数,但如果你使用一个函数作为输入,那么它会。不过我对这一部分不太清楚,只是我的直觉。

高阶函数可以将函数作为参数,也可以返回函数(或两者兼而有之)。您的函数只接受一个
字符串
,并返回一个
字符串的列表
,因此它不是高阶的。但是,如果您的排序函数也使用了一个函数(如用于确定排序的比较运算符),那么它的顺序将更高。在Haskell中,所有具有至少两个参数的函数都返回另一个函数:
a->b->c
a->(b->c)
相同。这意味着将高阶函数定义为返回的函数太宽泛了——它甚至会包括
(+)
!是的,但这就是高阶的定义。哈斯凯尔几乎生活和呼吸着高阶函数。看看维基百科,对“高阶函数”有不同的定义。特别是,类型化lambda演算将其定义为
(τ)形式的任何函数₁ → τ₂) → τ₃,可能是最适用于Haskell的代码。当我需要向列表中的所有内容添加1时,我使用(+1)——我使用(+)返回过程,因此(+)是(或者至少可以是)高阶过程。在Haskell中,我认为在许多情况下,高阶性可能需要根据具体情况来确定。此外,sortString肯定不是高阶函数,因为输入或输出都不是函数。是否可以使sortString成为高阶函数并获得以下输入和输出输入:“携带书籍的电话桌”输出:[“书籍”、“携带”、“桌子”、“电话”]@Sindu_u如果这是
sortString
的输入和输出,它不是一个高阶函数。它的输入或输出都不是函数。没有必要“使它成为一个高阶函数”让它来做这个。@Sindu_u看看Haskell的函数。
ghci> compare 'a' 'b'
LT
ghci> compare 'b' 'a'
GT