Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Module 我可以用一个模块实现多个模块类型吗?_Module_Constraints_Ocaml_Reason - Fatal编程技术网

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手册完全翻译成合理的版本会很好。