我想在OCaml中扩展一个仿函数。
例如,假设以下仿函数X
:
module type X = functor (A : ModuleA) -> I with type t := A.t
我正在尝试创建一个类似的仿函数Y
,它也接受A : Module A
但返回I
的扩展版本。
我正在尝试类似的事情:
module type Y = functor (A : ModuleA) ->
sig
include X(A)
val blah : A.t -> int
end
但是我得到了一个语法错误。
我正在尝试使用更多函数扩展X
的结果签名。这在OCaml中是否可行?我做错了什么?
谢谢!
编辑:
我想我的问题是:为什么仿函数对模块和模块类型的行为方式不同?
上面的仿函数X
返回一个模块类型(或者至少是我读取该表达式的方式)。如果允许这个表达式,那么为什么OCaml禁止扩展生成的模块类型?
答案 0 :(得分:4)
不幸的是,据我所知,这是不可能的。你必须要做
module type Y = functor (A : ModuleA) ->
sig
include I with type t := A.t
val blah : A.t -> int
end
希望其他人可以详细说明为什么您尝试使用的功能未实现。可能有一个很好的理由。
编辑:
如果您已经拥有XX
类型的模块X
(一个实例),则可以
module type Y = functor (A : ModuleA) ->
sig
include module type of XX(A)
val blah : A.t -> int
end