2011-07-28 100 views
6
超載

我已經定義了一些類型:功能OCaml中

type box = Box of int 
type table = Table of int 
type compare_result = Lt | Eq | Gt 

看來,OCaml中,我們不能定義2個功能與同名但不同類型的參數:

let compare (a: box) (b: box): compare_result = (...) 
let compare (a: table) (b: table): compare_result = (...) 

let res_box = compare (Box 1) (Box 2) in (* which is supposed to call the first funciton *) 
let res_table = compare (Table 1) (Table 2) in (* which is supposed to call the second function *) 

所以任何人都可以告訴我在OCaml中做什麼替代方法?我們必須以不同的方式命名這兩個功能嗎?

+1

請注意,您的第二個'compare'聲明將隱藏前一個(在Ocaml中沒有函數重載)。 – akoprowski

回答

6

是的,最簡單的解決方案是簡單地調用不同的功能。允許這樣做的程序極大地增加了類型系統的複雜性(而不是專家設計解決方案的可能性不大),以至於當他們這樣做時,你會發現它不可用。

用於編寫單個函數的現有解決方案compare是OCaml中的對象系統,以及Haskell中的類型類(對同一基本類型系統的不同擴展)。但是保留簡單的片段並以不同的方式命名您的函數compare要簡單得多。

+8

創建compare_box和compare_table的另一種方法是將每個類型和比較函數包裝在它們自己的模塊中。然後您可以調用Box.compare和Table.compare。 – hcarty

+0

如果您計劃從類型創建「Set」或「Map」,創建單獨的模塊也很方便。 – nlucaroni