簡體   English   中英

Haskell中的高階函數

[英]Higher Order Function in Haskell

我寫了下面的代碼。 我知道高階函數是一個接受另一個函數並返回結果的函數。 但是我不能清楚地區分一個函數是否是高階的。 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提供相對於其參數的Ordering例如

ghci> compare 'a' 'b'
LT
ghci> compare 'b' 'a'
GT

您可能已經注意到, flip本身是另一個高階函數,可以將參數重新排序或翻轉到另一個函數。 在上面的代碼中使用flip可以使我們以降序而不是升序對列表進行排序。

如果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)。 因此輸入不能是函數。

通常,您可以通過查詢函數的輸入和輸出類型來確定函數是否為高階。 如果這些功能之一可以是功能,則該功能可以是高階功能。

如果輸入可能是或不是功能,則可能會有一點灰色區域。 例如,假設您有一個接受輸入並返回相同輸出的函數(沒有意義,但這只是一個例子)。 然后,我想說的是,如果您使用字符作為輸入,那么它就不會充當高階函數,但是如果您使用函數作為輸入,那么它將成為函數。 不過,不確定那部分,只是我的直覺。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM