OCaml中include,require和open之间有什么区别?

Yix*_*Liu 8 ocaml

例如,

包括: include Ppx_core

打开: open Core.Std

要求: #require "compiler-libs.common"

并使用: #use "topfind"

Pat*_*atJ 10

  • include 在当前结构中重新导出模块的组件:您所在的模块将包含所有的定义Ppx_core.
  • open使得模块的组件可以在键入环境中直接访问.而不是键入Core.Std.element你可以只键入element.
  • #require是一个Topfind命令,它可以找到一个库并加载它,使您可以访问它的模块.
  • #use表现就好像将一个完整的文件直接复制到你的顶层.

请注意,#-keywords不是OCaml语言的一部分,而是顶级命令:如果您尝试编译文件,它们将无法工作.


ivg*_*ivg 7

include Module.Name模块定义中的语句将包括来自名为 的模块的所有定义Module.Name。这些定义将大致包含在复制粘贴时。如果include Module.Name出现在模块类型定义(又名签名定义)内部,则Module.Name应该是有效的(编译器已知的)模块类型。它将包括模块类型的定义(不包括任何类型共享约束)。

open Module.Name出现在模块实现和模块签名中的语句将允许您在Module.Name不使用完全限定名称的情况下引用 a 的定义(值、类型、子模块),即使用不带Module.Name前缀的短名称。

#require语句根本不是语句,也不是 OCaml 语法的一部分。它是 OCaml 顶层的特殊指令 - 交互式循环。同 ipython 一样有自己的指令。该require指令将加载指定的包及其所有依赖项。此外,该指令不是标准 OCaml 顶级分发的一部分,而是由topfind作为 ocamlfind 工具包一部分的脚本添加的。该#use指令用于加载和评估脚本。例如#use "topfind"将从topfindOCaml 标准库文件夹加载和评估脚本。此脚本将注册require指令。还有#load#load_rec 指令,在更细粒度的级别上工作,而不是包——这些指令旨在加载库。