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