我正在尝试在 OCaml 中扩展一个函子。例如,假设以下函子X
:
module type X = functor (A : ModuleA) -> I with type t := A.t
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个类似的函子Y
,它也接受A : Module A
但返回I
. 我正在尝试类似的东西:
module type Y = functor (A : ModuleA) ->
sig
include X(A)
val blah : A.t -> int
end
Run Code Online (Sandbox Code Playgroud)
但是我收到了一个语法错误。我正在尝试X
使用更多功能扩展生成的签名。这在 OCaml 中可能吗?我究竟做错了什么?
谢谢!
编辑:
我想我的问题是:为什么函子对于模块和模块类型的行为方式不同?
X
上面的函子返回一个模块类型(或者至少我是这样读那个表达式的)。如果允许这个表达式,那么为什么 OCaml 禁止扩展生成的模块类型?
不幸的是,据我所知,这是不可能的。你将不得不做
module type Y = functor (A : ModuleA) ->
sig
include I with type t := A.t
val blah : A.t -> int
end
Run Code Online (Sandbox Code Playgroud)
希望其他人可以详细说明为什么您尝试使用的功能没有实现。可能有一个很好的理由。
编辑:
如果你已经有一个模块XX
类型X
(一个实例),你可以做
module type Y = functor (A : ModuleA) ->
sig
include module type of XX(A)
val blah : A.t -> int
end
Run Code Online (Sandbox Code Playgroud)