在 OCaml 的模块中使用中缀运算符

问题描述 投票:0回答:2

我正在尝试在

 中定义一个带有自己的中缀运算符的 
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
工作正常(具有我预期的返回值)。

如何在不显式指定模块名称的情况下使用特定模块的中缀运算符?

ocaml functor infix-operator
2个回答
0
投票

要使用模块中的名称而不提及该模块,您需要打开该模块。

在很多情况下应该避免打开模块。对于这些情况,您可以使用本地打开:

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

0
投票

将要执行的操作封装在模块本身的函数中:

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
© www.soinside.com 2019 - 2024. All rights reserved.