我创建了一个新模块,它只是具有很长名称的模块的较短别名:
module M = ModuleWithLongName
我的情况是最终可执行文件的大小很重要。编译器是否正确处理了上述构造(即M
实际上只是一个别名),还是在定义ModuleWithLongName
的模块内复制M
的全部内容?
答案 0 :(得分:8)
不,OCaml语言不支持“真正的模块别名”。
但是,在您尝试相当高级的仿函数和抽象类型组合之前,您可能不会注意到。特别是,您只能在类型系统中观察此问题,而不是在程序的运行时行为中:模块有时会被复制,但可变状态会在副本之间出现别名(在您的示例中,如果ModuleWithLongName.foo
是可变参考,然后M.foo
是相同的参考。)
如果您使用一流模块,或在深层嵌套函数中定义本地模块,您可能会将模块复制操作视为整体计算中不可忽略的成本。推理一流模块性能的正确心理模型是,在类型检查和模块检查之后,它们就是完全记录。
答案 1 :(得分:2)
从版本4.02开始,OCaml支持true module aliases。
答案 2 :(得分:0)
我认为是module_path的别名。
模块moduleName = module_expr
和module_expr :: = module_path | ...