问题描述
我对在我用 CM 编译的 SML 项目中的另一个 SML 文件中使用来自一个 SML 文件的定义感到有些困惑。 A.sml
似乎只能使用来自 B.sml
的签名和结构定义,前提是它们已在 project.cm
文件中声明。
我想在 datatype MyType = MyConstr {name:string,other: string}
中声明一个 B.sml
,并在 MyType
中构造该类型 A.sml
的值。如果我正确理解 CM 文档,我只能导出结构、签名、函子和函子签名。这在代码重用方面听起来相当有限。
现在,这是否意味着我的 MyType
需要成为签名结构的一部分,以便我可以从另一个模块中使用它?
解决方法
您是正确的(在顶层)您只能导出模块,但这并不意味着您只能在一个文件中使用签名和结构定义(如果它们在 .cm
文件中描述) --- 只是需要通过 source(-)
(或类似方法)直接或间接提及它们,以便在库外部使用。
假设您想在 A.sml
中使用 B.sml
中的某个模块,并且您唯一的目标是从 structure Foo
中公开 B.sml
,然后类似
Library
structure Foo
is
A.sml
B.sml
应该够了。如果您还没有阅读 CM documentation(第 8-9 页)的 2.5 和 2.6 部分,您可能还想阅读。