2013-01-21 27 views
3

我想了解我自己,這polymorhism的形式確實OCaml的語言都有。OCaml多態性示例以外的模板函數?

我被一個例子

let id x = x 

提供這不是相當於例如C++模板函數

template<class A> A id(A x) { return x; } 

如果是這樣那麼我的問題是:是否有在OCaml的任何其他形式的多態性?這個概念在命令式語言世界中被稱爲「通用算法」,而不是「多態性」。

回答

12

基本上有三種語言的功能,有時被稱爲多態性

  • Parametric polymorphism(即「仿製藥」)
  • Subtype polymorphism,這是一個類型的子類型,以提供一個更具體的版本的功能比超型的操作的,即,重寫方法的能力(和運行時系統的調用基於所述運行時類型的對象的正確執行的方法的能力)。在OO語言中,這通常被簡稱爲「多態性」。
  • 所謂的ad-hoc polymorphism,即過載功能/方法的能力。

正如您已經發現的那樣,OCaml具有參數多態性。它也有亞型多態性。它沒有特別的多態性。

因爲在您的標題,你自找的例子,這裏的亞型多態性的例子OCaml中:

class c = object 
    method m x = x+1 
end 

class d = object 
    inherit c 
    method m x = x+2 
end 

let main = 
    let o:c = new d in 
    print_int (o#m 2) 

這將打印4

+0

+1現在我明白了,這是我認爲OP應該爲前一個問題寫的答案。 –

4

這種多態性被稱爲通用編程但它背後的理論概念被稱爲parametric polymorphism

您提供的兩個示例的確顯示參數多態性,但OCaml由強大的推理類型檢查程序支持,而不是由C++提供的(這是更實用和更多警告的解決方案)支持,因此真正的區別在於C++該代碼被複製爲每次使用它在你的代碼,而在OCaml中它是類型檢查通過驗證通過unification隱式類型變量的替代確實存在解決的類型。

一切都可以在OCaml中是多態的,只是因爲沒有通常標註有類型,因此在實踐中,如果事情可以作爲參數傳遞給任何函數則隱含允許的。

例如,你可以有一個類型變量來定義多態的方法:

let swap ((x : 'a), (y : 'b)) : 'b * 'a = (y, x) 

所以,這將工作任何類型'aØ'b是。

OCaml的另一個強大的多態特性是functors(這不是常見的C++函子),而是由其他模塊參數化的模塊。這個概念聽起來很可怕,但它確實代表了OCaml代碼的多態行爲的更高階。