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

时间:2017-03-06 17:28:43

标签: ocaml

例如,

包括:include Ppx_core

打开:open Core.Std

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

并使用:#use "topfind"

2 个答案:

答案 0 :(得分:7)

  • include re-exports当前结构中模块的组件:您所在的模块将包含Ppx_core中的所有定义。
  • open在输入环境中生成模块directly accessible的组件。您只需输入Core.Std.element
  • ,而不是键入element
  • #require是一个Topfind命令,可以找到一个库并加载它,使您可以访问它的模块。
  • #use表现得好像copying a full file直接进入您的顶层。

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

答案 1 :(得分:3)

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

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

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