OCaml中"with type"和函子之间的区别



假设以下模块:

module type A = sig
type a
type f = r:a -> unit Lwt.t
end
module type AA = A with type a = B.t

我不能让模块A参数化(把它变成一个函子(,接受B.t作为参数吗?

module type A (b: B.t) = sig
type f = r:b -> unit Lwt.t
end
module type AA = A(B.t)

这些是等价物吗?为什么有两种方法可以做同样的事情?

这些是等价物吗?为什么有两种方法可以做同样的事情?

没有,他们也没有。你的"函子"是无效的,你可以通过自己尝试很容易地发现。

函数和模块约束(即with type ...(在不同的域中工作。函数处理实现,模块约束处理签名/类型。此外,模块约束采用现有签名并向其添加信息(约束(,而函子采用模块实现作为参数,但不扩展它,或者需要输入和输出签名彼此之间存在任何关系。

可以使用函子来扩展实现,如前所述,使用include。但是,由于论证的签名是静态的,因此其可重用性和有用性是有限的:

module A (B1: B) = struct
include B
let x = 42
end

最新更新