2013-07-17 68 views
1

以下代碼顯示b在打開A後由A.b覆蓋。但是,A.b和B.b具有差異簽名,A.b取整數參數,而B.b取一個浮點參數。他們不應該互相重疊,是嗎?OCaml函數名稱collison在兩個模塊之間

# module A=struct let b x = x*10 end;; 
module A : sig val b : int -> int end 
# module B=struct let b x =x*. 3.14159 end ;; 
module B : sig val b : float -> float end 
# open B;; 
# open A;; 
# b 10;; 
- : int = 100 
# b 10.;; 
Error: This expression has type float but an expression was expected of type 
     int 
# 
+2

是什麼讓你覺得它不是「正確的」? – ygrek

回答

3

OCaml沒有你說的那種重載。每個名字只指一個對象。確定名稱的含義時不考慮類型。

你可以參考B.b通過其全名:

# B.b 10.;; 
- : float = 31.4159 

這也很好地避免打開模塊,除少數精心挑選的。

+0

實際上這不是很正確的主幹.. – ygrek

+0

對,我試圖避免複雜性。 –

3

在OCaml中,如果您打開兩個內部具有相同名稱的模塊,則會生成名稱衝突(無聲),而最後打開或定義的模塊會影響其他名稱。所以如果兩個模塊共用一個相同的名稱(B.bA.b),則應參考全名(包括模塊和功能)。

如果要定義模塊內部函數的快捷方式,可以將其定義爲let a_b = A.b

相關問題