如何与 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 节,您可能还想阅读。
在我用 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 节,您可能还想阅读。