如何与 SML 和 CM 共享数据类型声明

How to share datatype declaration with SML and CM

在我用 CM 编译的 SML 项目中,我对在另一个 SML 文件中使用一个 SML 文件的定义感到有点困惑。似乎 A.sml 只能使用 B.sml 中的签名和结构定义,前提是它们已在 project.cm 文件中声明。

我想在 B.sml 中声明一个 datatype MyType = MyConstr {name:string, other: string},并在 A.sml 中构造该类型的值 MyType。如果我正确理解 CM 文档,我只能导出结构、签名、函子和函子签名。这听起来在代码重用方面相当有限。

现在,这是否意味着我的 MyType 需要成为签名结构的一部分,以便我可以从另一个模块使用它?

你是对的,(在顶层)你只能导出模块,但这并不意味着你只能在一个文件中使用签名和结构定义,如果它们在 .cm 文件---只是需要通过 source(-)(或类似的)直接或间接提及它们以供库外部使用。

假设你在 A.sml 中有一些你想在 B.sml 中使用的模块,而你的唯一目标是从 B.sml 公开 structure Foo,那么一些东西喜欢

Library
    structure Foo
is
    A.sml
    B.sml

应该够了。如果您还没有阅读 CM documentation(第 8-9 页)的第 2.5 和 2.6 节,您可能还想阅读。