1

以下代码显示打开 A 后 b 被 Ab 覆盖。但是,Ab 和 Bb 具有不同的签名,Ab 接受整数参数,而 Bb 接受浮点参数。他们不应该互相超越,对吗?

# 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
# 
4

2 回答 2

3

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

你可以B.b通过它的全名来参考:

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

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

于 2013-07-17T05:02:28.710 回答
3

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

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

于 2013-07-17T05:10:01.827 回答