两个模块之间的OCaml函数名称冲突

时间:2013-07-17 03:05:52

标签: ocaml

以下代码显示在打开A后A.b覆盖b。但是,A.b和B.b具有不同的签名,A.b采用整数参数,而B.b采用浮点参数。它们不应该相互叠加,是不是?

# 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 个答案:

答案 0 :(得分:3)

OCaml没有你所说的那种超载。每个名称仅指一个对象。在确定名称的含义时不考虑类型。

您可以通过其全名来引用B.b

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

除了一些精心挑选的模块之外,避免打开模块也是很好的。

答案 1 :(得分:3)

在OCaml中,如果打开两个内部具有相同名称的模块,则会产生名称冲突(无声的),最后打开或定义的模块会影响其他模块。因此,如果两个模块共享一个相同的名称(B.bA.b),则应引用全名(包括模块和函数)。

如果要在模块内定义函数的快捷方式,可以始终将其定义为let a_b = A.b