我创建了一个新模块,它只是一个具有很长名称的模块的较短别名:
module M = ModuleWithLongName
Run Code Online (Sandbox Code Playgroud)
我的情况是最终可执行文件的大小很重要.上面的构造是由编译器妥善处理的(即M实际上只是一个别名),还是复制了定义ModuleWithLongName的模块内部的全部内容M?
不,OCaml语言不支持"真正的模块别名".
但是,在尝试相当高级的仿函数和抽象类型组合之前,您可能不会注意到.特别是,您只能在类型系统中观察到这个问题,而不是在程序的运行时行为中:模块有时会被复制,但可变状态会在副本之间出现别名(在您的示例中,如果ModuleWithLongName.foo是可变引用,则M.foo相同)参考).
如果您使用一流模块,或在深层嵌套函数中定义本地模块,您可能会将模块复制操作视为整体计算中不可忽略的成本.推理一流模块性能的正确心智模型是,在类型检查和模块检查之后,它们就是完全记录.