假设以下模块:
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