OCaml 模块中的抽象类型

2023-12-11

我在 OCaml 中有非常简单的签名和模块:

module type S = sig
  type t 
  val y : t
end;;

and

module M2 : S = struct
  type t = int
  let x = 1
  let y = x+2
end;;

我不能使用像这样的构造

M2.y

to get 3除非我将模块指定为

module M2 : S with type t = int = struct ...

为什么会这样呢?已经有声明说type t = int


混凝土,int价值M2.y确实不可用,因为满足以下两个条件:

  1. 的类型y is abstract在签名中S
    (没有type t = ... there)

  2. 模块M2被制作opaque关于签名S
    (换句话说,仅限于签名S via符号: S)

结果,您确实获得了:

let test = M2.y ;;
(* val test : M2.t = <abstr> *)

正如关键字所建议的<abstr>,这与以下概念有关抽象类型。这个概念是 OCaml 的类型规则强制执行的一个非常强大的功能,它可以防止模块的任何用户拥有签名S检查此类抽象类型的具体内容。因此,这个属性对于实现所谓的抽象数据类型(ADT)在 OCaml 中,通过仔细分离 ADT 的实现和签名。

如果缺少上述两个条件中的任何一个,该类型将不再是抽象的,并且具体值y将会出现。

更确切地说:

  1. 如果类型t具体化后,您将获得:

     module type S = sig
       type t = int
       val y : t
     end
    
     module M2 : S = struct
       type t = int
       let x = 1
       let y = x+2
     end
    
     let test = M2.y ;;
     (* val test : M2.t = 3 *)
    

    但实际上这并不是很有趣,因为你失去了一般性。然而,一种更有趣的方法是在签名中添加“评估器”或“漂亮打印机”功能,例如值int_of_t below:

     module type S = sig
       type t
       val y : t
       val int_of_t : t -> int
     end
    
     module M2 : S = struct
       type t = int
       let x = 1
       let y = x+2
       let int_of_t x = x
     end
    
     let test = M2.(int_of_t y) ;;
     (* val test : int = 3 *)
    
  2. 否则,如果模块M2变得透明,您将获得:

     module type S = sig
       type t
       val y : t
     end
    
     module M2 (* :S *) = struct
       type t = int
       let x = 1
       let y = x+2
     end
    
     let test = M2.y ;;
     (* val test : int = 3 *)
    

最后,值得注意的是,除了抽象类型的功能之外,OCaml 还提供了以下功能:私有类型这可以被视为模块化开发中使用的具体类型和抽象类型之间的权衡。有关此概念的更多详细信息,请参见示例章节。 8 骆驼裁判员.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OCaml 模块中的抽象类型 的相关文章

随机推荐

  • read.csv 无法从 Google 文档读取 CSV 文件

    我希望使用 read csv 来读取 google doc 电子表格 我尝试使用以下代码 data url lt http spreadsheets0 google com spreadsheet pub hl en hl en key 0
  • iPhone 关机时是否可以引发事件?

    我想做一个应用程序 当用户尝试关闭其 idevice 时执行某些操作 这可能吗 iOS SDK 中有相关事件吗 不 这是不可能的 没有 API 可供第三方应用程序在设备关闭时收到通知
  • 将 AJAX 返回数据转换为 JSON

    我正在尝试检索 JSON 对象中的数据 我已验证其格式正确 并将数据输出到 firebug 控制台 我使用 JSONLint http jsonlint com 验证了 JSON 并且知道数据不会以 JSON 对象返回 因为当我记录它时 它
  • 使用 chrome.experimental.webRequest API 更改加载的文件?

    我正在尝试使用 webRequest API 更改网页上加载的 swf 文件 该页面加载一个名为 chat swf 的文件 但我想重定向到同一目录中的 chat2 swf 以便使用另一个文件 有人告诉我这可行 但我不知道如何正确使用这个 A
  • pyad:安装正常,但说找不到 adbase

    这让我很困惑 我已经使用 pip 安装了 pyad 一切看起来都很好 C WINDOWS system32 gt pip install pyad Collecting pyad Using cached pyad 0 5 16 tar g
  • 无法在 eclipse 中安装 Oracle Weblogic Server Tools

    从 eclipse 安装 Oracle Weblogic Server Tools 时遇到此错误 正在安装的软件 Oracle WebLogic Server Tools 17 2 0 201806071916 oracle eclipse
  • 参数类型不兼容并且在此函数中未初始化

    当我调用它时 我的一个 两个方法出现问题main 我不确定为什么 int main struct list list list init list while TRUE struct book book1 printf Enter titl
  • 没有索引声明的 for 循环

    所以我在某个地方声明一个变量并初始化它 现在稍后我需要使用它来循环 同时它仍然为正 所以我需要减少它 对我来说 使用条件和递减循环需要 for 但对于它我们缺少初始化的第一部分 但我不需要初始化任何东西 那么我该如何以一种好的方式来解决这个
  • 在智能感知中显示异常?

    我正在使用 Visual Studio 2013 Ultimate 在 C 代码编辑器中 可以通过 Intellisense 列出已记录异常的成员 我的问题是 如何为 VB Net 添加这个有用的功能 是否有第 3 方扩展可以添加它 为什么
  • 在 bash 的 for 循环中使用“ls”是否安全

    我用它来循环 home 目录中的文件夹 for FOLDERNAME in ls 1 home 我想知道安全吗 如果您想要所有子目录 home use run in subshell so shopt s dotglob doesn t a
  • EF Core 多对多自加入

    我试图描述与 Entity Framework Core 2 的多对多自引用关系 本质上 我试图建模的是一种树结构 其中每个元素可以具有任意数量的父元素和子元素 所以我想更多的是图表而不是树 这是我到目前为止所拥有的 public clas
  • 在 C++ Builder 中实现 VirtualTreeView TVTDefaultAccessibleProvider

    当使用 VirtualStringTree 添加辅助功能支持时 需要包含该单元VirtualTrees Accessibility in the uses部分 这在德尔福中有效 在 C Builder 中相当于包含 include Virt
  • 基于条件类型的狭义类型(Typescript)

    我想创建需要可选参数之一的函数类型 据我所知 是制作条件类型 但问题是在函数打字稿中无法根据此条件缩小类型 type a propA number type b propB string type OneOfIsRequired
  • CreateObject("Scripting.FileSystemObject") 在 Excel for Mac 下不起作用 [重复]

    这个问题在这里已经有答案了 我有一段 VBA 代码 用于获取给定路径的子文件夹 它在以下情况下运行良好Excel for Windows Function GetSubFolders RootPath As String Dim fso A
  • 无法将 scipy 安装到 Raspberry pi 4 (raspbian)

    我正在尝试安装scipy图书馆与python3 m pip install user no use pep517 scipy但我收到以下错误 ERROR Failed building wheel for scipy Running set
  • Instant App,实际最低sdk是多少

    根据 Android 开发者网站 Instant 应用程序的最低 sdk 是 21 即 5 0 link 该网站明确指出 Android Instant Apps 可在大多数运行 Android 的设备上使用5 0 API 级别 21 和更
  • 如何从firebase数据库flutter中的地图获取值

    我有一个像这样的 json 结构 My6relBpWvPaY I4JvN idUser 4dca8440 a37d 11ec 9c66 9b8f61be17f0 message 777777 我想使用 fromJson 保存到地图 这是我的
  • 如何将后续意图上传到另一个父意图

    I m trying to upload a previously downloaded follow up intent in json to another parent intent with no success in the Di
  • 如何使用 pywinauto 控制 IE 浏览器

    好的 所以我想用 pywinauto 控制 IE Explorer 我想选择页面上的文本字段并编辑它们 有没有一种方法可以使用 pywinauto 执行此操作 而无需单击文本字段的位置 每次页面都是相同的 但输入的数据却不同 窗口可能不会每
  • OCaml 模块中的抽象类型

    我在 OCaml 中有非常简单的签名和模块 module type S sig type t val y t end and module M2 S struct type t int let x 1 let y x 2 end 我不能使用