OCaml签名函数子程序

3
我将尝试扩展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禁止扩展结果模块类型?

哪个语法错误? - coredump
1个回答

5
很遗憾,据我所知这是不可能的。你需要做...
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

1
这是不可能的,因为X不是一个函子,而是一个函子的签名。你不能应用它的原因与你不能应用函数的类型相同。 - PatJ
4
@PatJ:确实,但当涉及到有用性时,这个比喻就不成立了。函子类型是依赖类型。如果有一种方法可以在不实际执行应用程序的情况下获取函子应用程序的输出类型,那将非常有用。 - kne
我必须承认,但是任何使用函数对象的人都会在某个地方声明返回类型。 - PatJ
谢谢@kne。我实现了你的第一个建议。 在XY中维护重复代码很烦人,但我可以接受 :) - Saswat Padhi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接