【问题标题】:What's the difference between include, require and open in OCaml?OCaml 中的 include、require 和 open 有什么区别?
【发布时间】:2017-03-06 17:28:43
【问题描述】:

例如,

包括:include Ppx_core

打开:open Core.Std

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

并使用:#use "topfind"

【问题讨论】:

    标签: ocaml


    【解决方案1】:
    • includere-exports当前结构中模块的组件:您所在的模块将包含Ppx_core中的所有定义。
    • open 在打字环境中制作模块 directly accessible 的组件。您可以直接输入element,而不是输入Core.Std.element
    • #require 是一个 Topfind 命令,用于查找库并加载它,使其模块可供您访问。
    • #use 的行为就像 copying a full file 直接进入您的顶层一样。

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

    【讨论】:

    • 也许每个人都有一个动手示例会很好并使答案自成一体?
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-24
      • 2010-10-10
      • 1970-01-01
      • 2021-04-21
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      相关资源
      最近更新 更多