簡體   English   中英

什么是參數多態 function?

[英]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) swapDoubleswapInt的代碼除了它們的類型簽名外是相同的,(2)您在代碼中沒有任何地方引用任何取決於xy類型的內容. 無論其類型如何,此代碼均有效。 所以應該有一種方法可以只編寫一次代碼,讓編譯器針對您需要的每種類型自動專門化代碼。 實現這一點的方法是參數多態性。 對於這種特殊情況,您可以編寫:

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)時, ab是類型參數。

無論 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.

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