为什么编译器总是希望这个类型一次(=)重载?

时间:2015-08-11 16:51:47

标签: ocaml

我有一个问题,因为我不理解,我三天都不明白,我无法解决。

我有这样的代码:

module SpotLocation = struct
type t = {
    uuid : string option;
    netElement : string;
    coordIntrinsic : float;
}
end


module Segment = struct
    type t ={
        netElement : string;
        coordFrom : SpotLocation.t;
        coordTo : SpotLocation.t;
    }


    let isEqual segA segB = segA.coordFrom = segB.coordFrom && segA.coordTo = segB.coordTo

    let (=) = isEqual (* <<<<<<<<< Here is the problem *)

    let isIn seg loc = (seg.netElement = loc.netElement)

end

问题来自(=)我已经超载。

一旦我拥有它,编译器坚持做出以下反应:

Error: This expression has type string but an expression was expected of type t

我试图声明(=)的签名,但它不起作用。

例如,这给出了相同的东西:

module Segment = struct
type t ={
    netElement : string;
    coordFrom : SpotLocation.t;
    coordTo : SpotLocation.t;
}


let isEqual segA segB = segA.coordFrom = segB.coordFrom && segA.coordTo = segB.coordTo

let ((=) : t -> t -> bool) = isEqual (* <<<<<<<<< Here is the problem *)

let isIn (seg : t) (loc : SpotLocation.t) =
let open SpotLocation in
seg.netElement = loc.netElement

end

如果我在isIn之后移动(=),它可以工作,但是一旦我开始添加更多逻辑,它就会产生相同的错误。所以我不知道会发生什么。

有人可以向我解释一下吗?谢谢!

1 个答案:

答案 0 :(得分:5)

OCaml中没有函数重载。一旦定义了具有给定名称的函数(或该问题的任何其他类型的值),该名称将影响任何具有相同名称的现有值,只要它在范围内。

因此,一旦定义了全局=函数,旧文件的=将无法再访问该文件的其余部分,除非通过其完全限定名称Pervasives.=