2011-05-28 47 views
5

任何人可以解釋這與我有關排序算法?什麼是參數多態函數?

+3

你是什麼意思的「搜索」? – 2011-05-28 18:05:57

+0

關於整數快速排序 – Lunar 2011-05-28 18:16:43

+2

好了,簡而言之,它是[自然轉換](http://en.wikipedia.org/wiki/Natural_transformation)。但是說這樣只會使問題複雜化。 – 2011-05-28 18:25:29

回答

7

讓我試試我能做到的最簡單的事情。

假設你有一對整數:

foo :: (Int, Int) 
foo = (2,5) 

,並假設你想要的交換上對整數的位置的功能。你可以這樣做:

swapInt :: (Int, Int) -> (Int, Int) 
swapInt (x,y) = (y,x) 

但如果你現在需要Double提供了一個類似的功能,你就必須實現它againt:

swapDouble :: (Double, Double) -> (Double, Double) 
swapDouble (x,y) = (y,x) 

你必須要注意的幾件事情:( 1)swapDoubleswapInt的代碼除了它們的類型簽名外都是相同的,(2)代碼中沒有任何地方提及任何取決於xy的類型的內容。此代碼無論它們的類型是否有效。所以應該有一種方法來編寫代碼一次,讓編譯器自動爲您需要的每種類型專門編寫代碼。做到這一點的方法是參數多態。對於這種特殊情況,你可以寫:

swap :: (a,b) -> (b,a) 
swap (x,y) = (y,x) 

這是什麼意思?你告訴編譯器:有一個函數swap,它取一對(x,y),其中x的類型爲a,y的類型爲b,並返回對(y,x)。 a和b可以是任何類型,因此這個函數被稱爲多態函數。當您將swap應用於特定對時,編譯器將檢查此對的類型並自動實例化此函數的一個適用於您的元組的版本。

例如:

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) 

我們先來了解名稱:多態是任何功能或數據結構與許多不同類型的作品。參數導致實現多態的方式是在函數或數據結構的類型中包含「類型參數」。當您編寫(a,b)時,ab是類型參數。

許多數據結構可以被實現而不管包含在那裏的類型:列表,數組,映射,元組......,它們都可以具有參數多態的實現。並且對它們進行操作的函數:sort,map,fold ......可以在不需要引用特定類型的情況下實現,而是可以輸入將由編譯器自動進行特定的參數。例如,存在其他種類的多態性,並且Haskell也實現特別的多態性。

2

參數多態允許函數或數據類型一般地編寫,以便它可以在不依賴於類型的情況下以相同的方式處理值。參數多態是一種使語言更具表現力,同時仍保持全靜態類型安全性的方法。

- from:http://en.wikipedia.org/wiki/Polymorphism_(computer_science)。

對於搜索,我想這更多取決於確切的上下文 - 我無法幫到那裏。

+1

可能是這種情況。 最簡單的情況是'id :: a - > a'',它可以是任何類型的值,並且返回相同的值(當然仍然具有相同的類型)。沒有多態性,你必須爲所有類型 – 2011-05-28 18:07:42

+0

聲明'idInt :: Int - > Int'' idString :: String - > String'等。另外值得注意的是,因爲它很容易忘記。 「參數化」僅僅意味着函數的功能是基於其給定的參數。道歉,如果這是顯而易見的。 – Adam 2011-05-28 18:12:22

6

一個函數,它與它所使用的參數類型無關。

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可以在任何類型的列表上執行線性搜索;這就是使函數參數化(意思是函數參數)多態(因爲它們可以是多種類型)。

# 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" 

在談論這個函數的類型時,它被聲明爲(a -> b -> Bool) -> a -> [b] -> Maybe b。重要的是,字母表示類型變量,這意味着它們的類型可以是任何東西 - 也是使參數多態的函數的屬性。

+0

首先,'(a - > b - > Bool) - > a - > [b] - > Maybe b'中缺少'b'。其次,它應該是'只是x'而不是'只是n'。 – Rotsor 2011-05-29 07:25:10

相關問題