Module 我可以用一个模块实现多个模块类型吗?
鉴于这些模块类型:Module 我可以用一个模块实现多个模块类型吗?,module,constraints,ocaml,reason,Module,Constraints,Ocaml,Reason,鉴于这些模块类型: 模块类型编解码器类型={ t型; 类型令牌; }; 模块类型解码={ 包括编码类型; 让我们解码:BsGenericParser.Parse.parser(token,t); }; 模块类型编码={ 包括编码类型; 让我们编码:t=>list(令牌); }; 有没有办法在两个模块类型之间共享抽象类型t和token? 我试过: 模块类型编解码器={ 包括编码; 包括解码; } 但是编译器会抱怨名称冲突。确实可以,使用with: 模块类型编解码器={ 包括编码; 包括类型为t
模块类型编解码器类型={
t型;
类型令牌;
};
模块类型解码={
包括编码类型;
让我们解码:BsGenericParser.Parse.parser(token,t);
};
模块类型编码={
包括编码类型;
让我们编码:t=>list(令牌);
};
有没有办法在两个模块类型之间共享抽象类型t
和token
?
我试过:
模块类型编解码器={
包括编码;
包括解码;
}
但是编译器会抱怨名称冲突。确实可以,使用with:
模块类型编解码器={
包括编码;
包括类型为t:=t和类型为token:=token的解码;
}
请注意,您也可以使用=
而不是:=
编写签名约束,但这将产生相同的错误。它们之间的区别在于,=
是一种类型相等,要求两侧的类型相等,:=
将替换左侧的类型(“破坏性替换”)。在这种情况下,这意味着将Decode.t
替换为Encode.t
为了更好地说明这一点,请考虑这个例子:
模块类型编解码器={
u型;
包括类型为t:=u的编码;
包括类型为t:=u和类型为token:=token的解码;
}
这将导致以下模块类型:
模块类型编解码器={
u型;
类型令牌;
让我们编码:u=>list(令牌);
让解码:列表(令牌)=>u;
};
其中,
t
不再出现,取而代之的是u
。我不知道。请看我刚才在末尾添加的注释。我希望我们的常驻文档专家要么知道它在哪里,要么在必要时修复它。至少现在这里像通常一样记录了它,如果这没有记录在手册的技术参考部分,这意味着文档在扩展章节中:。谢谢@octachron。这也是一个很好的解释。我认为很难找到的一个原因是它使用了术语“签名约束”,而核心语言称之为“模块约束”(尽管它也提到了“受限签名”)。这使得通过搜索查找更加困难。对于那些以前从未接触过ocaml的人来说,将ocaml手册完全翻译成合理的版本会很好。