[英]What is a parametrically polymorphic function?
有人可以就排序算法向我解釋一下嗎?
讓我嘗試我能做的最簡單的事情。
假設你有一對整數:
foo :: (Int, Int)
foo = (2,5)
並假設您想要一個 function 交換該對上整數的 position。 你可以這樣做:
swapInt :: (Int, Int) -> (Int, Int)
swapInt (x,y) = (y,x)
但是現在如果你需要一個類似的 function 用於Double
s,你必須再次實現它:
swapDouble :: (Double, Double) -> (Double, Double)
swapDouble (x,y) = (y,x)
您必須注意幾件事:(1) swapDouble
和swapInt
的代碼除了它們的類型簽名外是相同的,(2)您在代碼中沒有任何地方引用任何取決於x
和y
類型的內容. 無論其類型如何,此代碼均有效。 所以應該有一種方法可以只編寫一次代碼,讓編譯器針對您需要的每種類型自動專門化代碼。 實現這一點的方法是參數多態性。 對於這種特殊情況,您可以編寫:
swap :: (a,b) -> (b,a)
swap (x,y) = (y,x)
這意味着什么? 您是在告訴編譯器:有一個 function 交換,它采用一對 (x,y),其中 x 是 a 類型,y 是 b 類型,並返回對 (y,x)。 a 和 b 可以是任何類型,因此這個 function 稱為多態 function。 當您將swap
應用於特定對時,編譯器將檢查該對的類型並自動實例化此 function 的版本,該版本足以滿足您的元組。
例如:
swap ('a', 1) = (1,'a') -- in this case swap :: (Char, Int) -> (Int, Char)
swap ( 0 , 5) = (5, 0 ) -- in this case swap :: (Int , Int) -> (Int, Int )
讓我們理解這個名稱:多態是任何 function 或適用於許多不同類型的數據結構。 參數化實現多態性的方式是在function或數據結構的類型中具有“類型參數”。 當您編寫(a,b)
時, a
和b
是類型參數。
無論 then 中包含何種類型,都可以實現許多數據結構:列表、arrays、映射、元組……它們都可以具有參數化的多態實現。 以及對它們進行操作的函數:sort、map、fold、... 可以在不必引用特定類型的情況下實現,但要輸入編譯器會自動專門化的參數。
還存在其他類型的多態性,例如,Haskell 也使用類型類實現臨時多態性。
一個 function 與它使用的參數類型無關。
linear_search f n [] = Nothing
linear_search f n (x:xs)
| f n x = Just x
| otherwise = linear_search f n xs
我的 Haskell 生銹了,所以如果有人能糾正評論中的錯誤,將不勝感激。
這里的想法是linear_search
可以對任何類型的列表進行線性搜索; 這就是使 function 參數化(即 function 參數)多態的原因(因為它們可以是多種類型)。
# preforming on integers
linear_search (==) 5 [1,2,3,4,5]
# returns Just 5
# preforming on strings
linear_search (elem) 'e' ["doctor", "apron", "horse", "sky"]
# returns Just "horse"
當談到這個 function 的類型時,它被表述為(a -> b -> Bool) -> a -> [b] -> Maybe b
。 重要的是,字母表示類型變量,這意味着它們的類型可以是任何東西——這也是使函數參數多態的屬性。
參數多態性允許 function 或數據類型被通用寫入,因此它可以相同地處理值而不依賴於它們的類型。 參數多態性是一種使語言更具表現力的方法,同時仍保持完整的 static 類型安全。
-- 來自: http://en.wikipedia.org/wiki/Polymorphism_(computer_science )。
關於搜索,我想這更多地取決於確切的上下文 - 我無能為力。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.