我正在尝试在
中定义一个带有自己的中缀运算符的
SCALAR
签名
module type SCALAR =
sig
type t (* type of scalar element *)
val zero : t
val one : t
val (++) : t -> t -> t (* infix addition: t ++ t *)
end
使用
SCALAR
签名,我定义了一个 INT
模块:
module INT : SCALAR with type t = int
=
struct
type t = int
let zero = 0
let one = 1
let (++) x y = x + y
end
我期望添加两个带有定义的中缀运算符的
INT
模块,如INT.zero ++ INT.one
是有效的操作,并期望其返回值int = 1
,但它会引发“无界值++”的错误。
但是,
INT.(++) INT.zero INT.one
工作正常(具有我预期的返回值)。
如何在不显式指定模块名称的情况下使用特定模块的中缀运算符?
要使用模块中的名称而不提及该模块,您需要打开该模块。
在很多情况下应该避免打开模块。对于这些情况,您可以使用本地打开:
# let open INT in zero ++ one;;
- : INT.t = 1
#
另一种形式:
# INT.(zero ++ one);;
- : INT.t = 1
#
您还可以为 INT 创建一个本地同义词。(++):
# let (++) = INT.(++)
val ( ++ ) : INT.t -> INT.t -> INT.t = <fun>
# Int.zero ++ INT.one;;
- : INT.t = 1
#
将要执行的操作封装在模块本身的函数中:
module INT : SCALAR with type t = int = struct
type t = int
let zero = 0
let one = 1
let (++) x y = x + y
(* Encapsulate the operation in a function *)
let add x y = x ++ y
end
let () =
let result = INT.add INT.zero INT.one in
print_int result