任何人可以解釋這與我有關排序算法?什麼是參數多態函數?
回答
讓我試試我能做到的最簡單的事情。
假設你有一對整數:
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)swapDouble
和swapInt
的代碼除了它們的類型簽名外都是相同的,(2)代碼中沒有任何地方提及任何取決於x
和y
的類型的內容。此代碼無論它們的類型是否有效。所以應該有一種方法來編寫代碼一次,讓編譯器自動爲您需要的每種類型專門編寫代碼。做到這一點的方法是參數多態。對於這種特殊情況,你可以寫:
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)
時,a
和b
是類型參數。
許多數據結構可以被實現而不管包含在那裏的類型:列表,數組,映射,元組......,它們都可以具有參數多態的實現。並且對它們進行操作的函數:sort,map,fold ......可以在不需要引用特定類型的情況下實現,而是可以輸入將由編譯器自動進行特定的參數。例如,存在其他種類的多態性,並且Haskell也實現特別的多態性。
參數多態允許函數或數據類型一般地編寫,以便它可以在不依賴於類型的情況下以相同的方式處理值。參數多態是一種使語言更具表現力,同時仍保持全靜態類型安全性的方法。
- from:http://en.wikipedia.org/wiki/Polymorphism_(computer_science)。
對於搜索,我想這更多取決於確切的上下文 - 我無法幫到那裏。
可能是這種情況。 最簡單的情況是'id :: a - > a'',它可以是任何類型的值,並且返回相同的值(當然仍然具有相同的類型)。沒有多態性,你必須爲所有類型 – 2011-05-28 18:07:42
聲明'idInt :: Int - > Int'' idString :: String - > String'等。另外值得注意的是,因爲它很容易忘記。 「參數化」僅僅意味着函數的功能是基於其給定的參數。道歉,如果這是顯而易見的。 – Adam 2011-05-28 18:12:22
一個函數,它與它所使用的參數類型無關。
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
。重要的是,字母表示類型變量,這意味着它們的類型可以是任何東西 - 也是使參數多態的函數的屬性。
首先,'(a - > b - > Bool) - > a - > [b] - > Maybe b'中缺少'b'。其次,它應該是'只是x'而不是'只是n'。 – Rotsor 2011-05-29 07:25:10
- 1. 爲什麼在Ocaml中函數參數不能是多態的?
- 2. 函數參數是什麼?
- 3. 函數參數,多態性
- 4. OpenCV:WarpPerspective函數的參數是什麼?
- 5. 什麼是current_user_can()函數參數?
- 6. beforeSend jquery函數的參數是什麼?
- 7. 什麼是可變參數函數?
- 8. 什麼是參數的類型,這個函數做什麼?
- 9. 什麼是@參數?
- 10. 爲什麼CanvasRenderingContext2D.createLinearGradient()不是靜態函數?
- 11. 什麼是非靜態成員函數?
- 12. 靜態函數的優點是什麼?
- 13. 靜態函數的語法是什麼?
- 14. int const函數(參數),int函數(const參數)和int函數(參數)const之間的區別是什麼?
- 15. 什麼是傳遞多個參數
- 16. 什麼是開始多參數
- 17. 多態函數參數/返回值C
- 18. 什麼是C++中的參數化和包含多態性
- 19. C編程:void * - 爲什麼不是參數多態?
- 20. 參數中的3個點是什麼?/什麼是可變參數(...)參數?
- 21. T應該是一個參數,一個函數還是什麼?
- 22. 爲什麼函數參數中沒有動態位模式?
- 23. debug_backtrace()捕獲什麼狀態的函數參數?
- 24. 什麼是函數onCreateView的「容器參數的描述」是什麼意思?
- 25. 如果參數不是整數,Access DateSerial函數返回什麼
- 26. Java的setAlignment函數有什麼參數?
- 27. 什麼參數傳遞給EOF()函數
- 28. 爲什麼使用更少/更多的參數重載函數?
- 29. 爲什麼我的Excel函數有太多的參數?
- 30. ON_LBN_SELCHANGE的參數是什麼?
你是什麼意思的「搜索」? – 2011-05-28 18:05:57
關於整數快速排序 – Lunar 2011-05-28 18:16:43
好了,簡而言之,它是[自然轉換](http://en.wikipedia.org/wiki/Natural_transformation)。但是說這樣只會使問題複雜化。 – 2011-05-28 18:25:29