我想了解我自己,這polymorhism的形式確實OCaml的語言都有。OCaml多態性示例以外的模板函數?
我被一個例子
let id x = x
提供這不是相當於例如C++模板函數
template<class A> A id(A x) { return x; }
如果是這樣那麼我的問題是:是否有在OCaml的任何其他形式的多態性?這個概念在命令式語言世界中被稱爲「通用算法」,而不是「多態性」。
我想了解我自己,這polymorhism的形式確實OCaml的語言都有。OCaml多態性示例以外的模板函數?
我被一個例子
let id x = x
提供這不是相當於例如C++模板函數
template<class A> A id(A x) { return x; }
如果是這樣那麼我的問題是:是否有在OCaml的任何其他形式的多態性?這個概念在命令式語言世界中被稱爲「通用算法」,而不是「多態性」。
基本上有三種語言的功能,有時被稱爲多態性
正如您已經發現的那樣,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
。
這種多態性被稱爲通用編程但它背後的理論概念被稱爲parametric polymorphism。
您提供的兩個示例的確顯示參數多態性,但OCaml由強大的推理類型檢查程序支持,而不是由C++提供的(這是更實用和更多警告的解決方案)支持,因此真正的區別在於C++該代碼被複製爲每次使用它在你的代碼,而在OCaml中它是類型檢查通過驗證通過unification隱式類型變量的替代確實存在解決的類型。
一切都可以在OCaml中是多態的,只是因爲沒有通常標註有類型,因此在實踐中,如果事情可以作爲參數傳遞給任何函數則隱含允許的。
例如,你可以有一個類型變量來定義多態的方法:
let swap ((x : 'a), (y : 'b)) : 'b * 'a = (y, x)
所以,這將工作任何類型'a
Ø'b
是。
OCaml的另一個強大的多態特性是functors(這不是常見的C++函子),而是由其他模塊參數化的模塊。這個概念聽起來很可怕,但它確實代表了OCaml代碼的多態行爲的更高階。
+1現在我明白了,這是我認爲OP應該爲前一個問題寫的答案。 –