Module ReasonML中的Fluent接口

Module ReasonML中的Fluent接口,module,ocaml,functor,fluent,reason,Module,Ocaml,Functor,Fluent,Reason,有没有办法让一个模块使用函子子模块返回它自己的类型 范例 module type A = {}; module type B = { let varB: int; }; module AMod : A = {}; module BMod : B = { let varB = 42; }; module Fn = (A: A, B: B) => A; /* Lets say this does some complex function that returns Type A */ mo

有没有办法让一个模块使用函子子模块返回它自己的类型

范例

module type A = {};
module type B = { let varB: int; };

module AMod : A = {};
module BMod : B = { let varB = 42; };

module Fn = (A: A, B: B) => A; /* Lets say this does some complex function that returns Type A */
module A2 = Fn(AMod, BMod);
我想要的是一个流畅的接口,其中一个函子将位于一个返回其自身类型的

module type C = { module Fn: (B) => C };
module CMod : C = { Fn: (B) => C};

module C2 = CMod.Fn(BMod).Fn(BMod).Fn(BMod).Fn(BMod).Fn(BMod);
这是合理的还是Ocaml


谢谢

不,这是不可能的。您的模块类型
C
将是递归的,这是不允许的。鉴于模块类型的表达能力,这种形式的递归很容易导致不可判定的类型检查

似乎您正试图将面向对象的模式强加到模块上,这通常不起作用——ML模块本质上是一种函数式语言。下面的问题是什么

module A2 = Fn(Fn(Fn(Fn(Fn(A, B), B), B), B), B)
如果您对缩短通用模式感兴趣,那么实际上可以实现一个模块组合器(在普通的Ocaml中,因为我不太了解原因语法):


您还可以编写组合器,以获取不同
B
模块的列表,尽管我想知道这在实践中有多有用。

不,这是不可能的。您的模块类型
C
将是递归的,这是不允许的。鉴于模块类型的表达能力,这种形式的递归很容易导致不可判定的类型检查

似乎您正试图将面向对象的模式强加到模块上,这通常不起作用——ML模块本质上是一种函数式语言。下面的问题是什么

module A2 = Fn(Fn(Fn(Fn(Fn(A, B), B), B), B), B)
如果您对缩短通用模式感兴趣,那么实际上可以实现一个模块组合器(在普通的Ocaml中,因为我不太了解原因语法):


您还可以编写组合器,以获取不同
B
模块的列表,尽管我想知道这在实践中有多有用。

FYI,有一些工具可以在OCaml和Reason之间自动转换,例如,这是完美的。我不知道你可以通过这种方式将模块传递给函数。我将探索模块组合器谢谢!仅供参考,有一些工具可以在OCaml和Reason之间自动转换,例如,这很完美。我不知道你可以通过这种方式将模块传递给函数。我将探索模块组合器谢谢!