2011-11-27 96 views
2

由於Ocaml不接受函數重載,有時我必須爲不同類型定義一些類似的函數。例如,Ocaml中函數的命名約定

let reduce_a (a: A): A = ... 
let reduce_b (b: B): B = ... 

let a_compare (a0: A) (a1: A): bool = ... 
let b_compare (b0: B) (b1: B): bool = ... 

我知道,最好的辦法是有兩個模塊AB,使2個功能A.reduceB.reduce。但在創建模塊之前,我只想知道命名函數的最佳約定。

難道人們通常更喜歡將reduce_a(動詞前的動詞)還是a_reduce(動詞前的類型)命名?我們可以在標準庫中找到一些例子嗎?

回答

1

我發現a_compare格式比compare_a更適合使用,包括OCaml編譯器本身,因此您可以使用該約定。沒有任何實際的好處,除了可能的美觀對齊,以及它感覺像一個名字空間的事實。

請注意,對於不同類型的記錄類型和構造函數中的標籤,這比使用函數的情況要多得多。

6

另一種方法是把它們放在自己的模塊,像

module A = struct 

    type t = ... 
    let reduce x = ... 
    let compare x y = ... 

end 

module B = struct ... (* you get the point *) end 

這樣你不必擔心,如果函數是compare_aa_compare,因爲它必須是A.compare。你必須剋制自己(除了本地)打開模塊。當然這個解決方案的可行性取決於你正在處理的類型。