我有一个问题,因为我不理解,我三天都不明白,我无法解决。
我有这样的代码:
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之后移动(=),它可以工作,但是一旦我开始添加更多逻辑,它就会产生相同的错误。所以我不知道会发生什么。
有人可以向我解释一下吗?谢谢!
答案 0 :(得分:5)
OCaml中没有函数重载。一旦定义了具有给定名称的函数(或该问题的任何其他类型的值),该名称将影响任何具有相同名称的现有值,只要它在范围内。
因此,一旦定义了全局=
函数,旧文件的=
将无法再访问该文件的其余部分,除非通过其完全限定名称Pervasives.=
。