如何让 ocaml 相信两个函子实例化是相等的

2024-03-01

假设我有许多模块,它们都使用一种模块类型进行参数化,并且彼此之间也具有依赖关系:

module type AT = sig  
end

module B(A: AT) = struct
  module Hash = struct
    type t = int
    let equal b1 b2 = b1 = b2
    let hash b = b
  end
end

module C(A: AT) = struct
  module B = B(A)
  module Hashtbl = Hashtbl.Make(B.Hash)

  let make () = Hashtbl.create 16
end

module D(A: AT) = struct
  module B = B(A)
  module Hashtbl = Hashtbl.Make(B.Hash)

  let use ht =
    Hashtbl.clear ht
end

module E(A: AT) = struct
  module C = C(A)
  module D = D(A)

  let f () =
    D.use (C.make ())
end

在这里,一切都参数化了AT. Then, C and D是独立的,并且E依赖于取决于C and D。这段代码无法编译,因为编译器不相信里面E, C.Hashtbl and D.Hashtbl是相同的模块:

File "xxxx.ml", line xx, characters xx-xx:
Error: This expression has type 'a C.Hashtbl.t = 'a Hashtbl.Make(C.B.Hash).t
       but an expression was expected of type
         'b D.Hashtbl.t = 'b Hashtbl.Make(D.B.Hash).t

有没有一种快速方法可以让 ocaml 相信两个哈希集模块是相同的?


类型检查器是正确的,这两个Hashtbl模块不相同,不应混合在一起:例如考虑稍微修改一下B module:

module B(A: AT) = struct
  module Hash = struct
    let y = Random.int 10
    type t = int
    let equal b1 b2 = b1 = b2
    let hash b = b + y
  end
end

然后两个实例C.B and D.B函子应用的F(A)不要共用同一种盐。因此,混合源自以下的哈希表C.B.Hash and D.B.Hash将是一个导致完全不稳定的行为的错误。

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

如何让 ocaml 相信两个函子实例化是相等的 的相关文章

  • 当我用 menhir 生成解析器时,有没有办法导出更多东西?

    我正在使用 menhir 生成解析器 现在 它从我的 parser mly 文件生成的 parser mli 文件如下所示 The type of tokens type token huge ADT definition goes her
  • OCaml:在 GTK 中嵌入 openGL

    我想将 openGL 图形嵌入 OCaml 中的 GTK 程序中 您对如何做到这一点有什么想法吗 编辑 Tk 似乎已经解决了问题Togl http togl sourceforge net 在我的 ubuntu 中 我有包 liblablg
  • 在 OCaml 中模拟 try-with-finally

    OCaml s try with不提供finally像Java这样的子句 不过 它会很有用 尤其是在处理副作用时 例如 我喜欢打开一个文件 将打开的文件传递给一个函数 然后关闭它 如果函数引发异常 我必须捕获它才能有机会关闭文件 当打开多个
  • 修复 OCaml 中的数据类型

    Haskell 中的以下数据类型如何用 OCaml 或 SML 表示 newtype Fix f In f Fix f 我已经在邮件列表上回答了这个问题 https sympa inria fr sympa arc caml list 20
  • 在 OCaml 中读取 URL 的 HTML 内容

    我想编写一个 OCaml 函数 它接受一个 URL 并返回一个由该位置的 HTML 文件内容组成的字符串 有任何想法吗 多谢 最好的 苏里卡托 我已经使用 ocurl 和 nethtml 完成了这两件事 ocurl http sourcef
  • 如何设置Emacs默认编译目录?

    我正在 Emacs 下编写 OCaml 代码 我有一个makefile在工作文件夹中 以及几个包含以下内容的子文件夹 ml文件 如果我启动M x compile and make在缓冲区上工作正常makefile 但不适用于 a 的缓冲区
  • OCaml 中的“Eval”字符串

    我正在尝试 评估 表示 OCaml 中的 OCaml 表达式的字符串 我想做一些与 Python 类似的事情eval https docs python org 3 library functions html eval 到目前为止我还没有
  • F# 中的命令式多态性

    OCaml 的 Hindley Milner 类型系统不允许命令式多态性 类似于 System F 除非通过最近对记录类型的扩展 这同样适用于 F 然而 有时需要将用命令式多态性 例如 Coq 编写的程序翻译成此类语言 Coq 的 OCam
  • 让menhir将用户定义的函数从.mly添加到.mli

    Menhir 允许将任意 ocaml 代码添加到 mly 文件的末尾 我想在其中声明一些函数 但我找不到一种方法让 menhir 将我的函数添加到 mli 文件中 以便它们从其他模块中可见 是否可以 答案很简单 那就是no 中定义的代码 m
  • 如何让 ocaml 相信两个函子实例化是相等的

    假设我有许多模块 它们都使用一种模块类型进行参数化 并且彼此之间也具有依赖关系 module type AT sig end module B A AT struct module Hash struct type t int let eq
  • OCaml 是否复制了自定义块?

    想象一下 我有一个名为 libcat 的 C 库 用于与我的毛茸茸的猫进行交互 因此 我正在为 OCaml 编写绑定来简化与 fluffy 的交互 module type CAT sig type cat val find gt cat v
  • OCaml 的并行化能力状况如何?

    我对在项目中使用 OCaml 很感兴趣 但是我不确定它的并行化功能在哪里 OCaml中有消息传递能力吗 OCaml 是否能够有效地使用 1 个以上的 CPU 我读到的关于这个主题的大部分内容都是在 2002 年至 2006 年写的 我没有看
  • 如何从ocaml列表中获取子列表

    我正在查看列表文档 图书馆好像没有提供sublist功能 我正在尝试从中获取元素列表i to j 现在我必须把它写成 let rec sublist list i j if i gt j then else List nth list i
  • 在哪里可以找到 OCaml Option 模块?

    我的意思是这个模块 Option http ocaml lib sourceforge net doc Option html 我找不到它 open Option给我Error Unbound module Option并且没有 optio
  • 将 OCaml 转换为 F#:将 OCaml open_box 和 close_box 转换为 F#

    我正在将几个基于 OCaml 的模块转换为 F 并遇到了 OCaml 打印格式化函数open box 和 close box http caml inria fr pub docs manual ocaml libref Format ht
  • OCaml:如何运行包含库的脚本

    我正在按照 Real World OCaml 一书来学习 OCaml 许多程序都需要使用 Jane Street Core 库 当我在顶层使用这个核心库中的函数时 它工作得很好 在那里 我只需使用以下命令来打开 Core 库 use top
  • OCaml 中的线性类型

    Rust http www rust lang org 有一个线性类型系统 有什么 好的 方法可以在 OCaml 中模拟这个吗 例如 当使用 ocaml lua 时 我想确保仅当 Lua 处于特定状态 堆栈顶部的表等 时才调用某些函数 Ed
  • OCaml:为什么重命名类型会失败并显示“它们的种类不同”

    我正在为成对的类型见证和见证类型的值构建一个通用容器 我想将其用于几种不同的类型 这会给我带来错误 因为这些类型的名称都相同 所以我尝试重命名函子结果中的类型 如下所示 module type Witness sig type a key
  • OCaml 3.12 中的一流模块:它们将使哪些事情变得更容易(或可能)?

    我听说 OCaml 3 12 中即将推出 一流模块 他们将提供什么优势 哪些孩子的事情会变得更容易 他们试图解决什么问题 一个简单的例子就足够了 这只是一个可能的应用程序 但一流的模块可以轻松地对存在类型进行编码 基本上是一个模块打包存在类
  • Ocaml 模块和包的区别

    我基本上是在尝试遵循这篇文章中的 stackoverflow 答案 OCaml 中 HttpRequest 的最佳模块是什么 https stackoverflow com questions 14134116 what is the be

随机推荐

  • 为什么 Google+ 登录完成登录时出错?

    我最近一直在处理 Android 上的 Google 登录问题 有一件事一直困扰着我 在他们所有官方认可的示例中 没有一个方法专门显示登录过程 每次尝试让某人登录时调用的方法称为resolveSignInError 如下所示 private
  • 溢出与 Inf

    当我输入一个大于 max 的数字时double https en wikipedia org wiki Double precision floating point format在 Matlab 中大约是1 79769e 308 例如10
  • NSOutlineView拖线卡住+蓝色边框

    我想要正确的行为蓝色拖动条 and 没有蓝色矩形拖动时 你知道我的错误在哪里吗 如您所见 蓝色条卡在顶部 就像本主题中一样 使用拖放重新排列时 小圆线条卡在 NSOutlineView 顶部 https stackoverflow com
  • 如何在 playwright-java 中切换到新选项卡或窗口?

    我们如何切换到运行测试时打开的新窗口 以及如何返回到 playwright java 中的父窗口 没有像 Selenium 这样的 Switch 操作 您可以使用waitForPage or waitForPopup功能 您只需要知道触发该
  • C 迭代结构体数组

    说我已经声明了一个结构 struct mystruct char a 10 double b struct mystruct array 20 test1 1 0 test2 2 0 lt I just want to declare 2
  • XML 标签、属性及其定义

    我正在寻找一个包含所有 XML 标签及其属性以及这些属性的定义 即它们影响 执行的操作 的列表的地方 我认为 MSDN W3C 甚至 Stack Overflow 上都会有这个 但我在这两个地方以及其他地方都找不到它 可能我在这些网站上查找
  • R 中的波形点 (~.)

    谁能解释一下 R 中的波形点 我已经看过一些关于它的帖子 我知道波形符用于公式 指定自变量和因变量 而且 我知道点用于指示所有其他变量 更具体地说 有人可以解释这个例子中的波形点吗 x lt sample 10 x gt detect gt
  • 链接 PHP 文本

    我正在使用 TinySong api 生成链接 它可以工作 现在我尝试使用 linkify 来生成链接 事实并非如此 我不确定为什么它没有链接 我相信我使用了正确的变量 这是代码
  • Java 中的 Perlin 噪声

    对于我正在从事的元胞自动机项目 我需要使用不同的算法和技术随机生成二维布尔数组 目前 我在应用程序中只有一种类型的随机化 循环遍历数组中的每个单元格并生成随机双变量 然后如果随机数高于 0 5 则将该单元格设置为 true 如果不是 则设置
  • 未定义的子例程 &main::首先在 hello.pl 第 6 行调用

    我的 Perl 代码面临一个问题 我创建了一个包 Welcome pm 并在脚本 hello pl 中使用它 但出现以下错误 未定义子例程 main First 在 hello pl 第 6 行调用 我也查看了其他答案 但仍然无法弄清楚代码
  • 无法在 Android 上显示实时流数据

    我正在尝试将原始 H264 数据从相机设备显示到我的 Android 应用程序 我能够在 Textview 上接收数据 但无法在 Textureview 上显示它 我是 android 的初学者 我不是解码原始数据的专家 如果有人能提出解决
  • Android Webview 加载对话框没有被关闭

    我正在使用以下代码 class CustomWebViewClient extends WebViewClient Context context ProgressDialog pd null public CustomWebViewCli
  • 如何写入或读取 XML 配置文件 (.config)

    我必须在安装的后期部分编写一个配置文件 如果存在旧版本的产品 则必须从配置文件中读取 配置文件是 XML 配置文件 config 配置文件将有很多条目 例如
  • .css .js 文件上的 php-fpm apache2 403 错误

    我正在尝试在 debian jessie 上设置一个具有多个虚拟主机的 apache2 服务器 我希望他们每个人都有一个不同的 FastCgiExternalServer 我在 jessie 上使用 php5 fpm 包中的 php 版本以
  • Pandas 将计算行添加到数据框的底部

    下面是我拥有的数据框的一个小样本 我想在其底部添加一个计算行 sch q1 q2 q3 acc Yes Yes No acc Yes No No acc Yes No No acc Yes Yes Yes 我想在底部添加一行 该行将给出每列
  • mysql查询生成序列号

    我有一张表 student marks marks 44 55 64 98 76 预期输出 serial number marks 1 44 2 55 3 64 4 98 5 76 使用 mysql 用户定义的变量 可以使用查询来完成 se
  • 单元测试 Swagger 输出

    我在 ASP NET MVC WebAPI 项目中使用 Swagger 该项目安装了 Swashbuckle nugget 包并生成 Swagger UI 和 Swagger docs v1 我一直遇到的一个问题是 开发人员会因为不仔细命名
  • Python 中的基本日志记录 dictConfig

    NOTE我知道这个答案 https stackoverflow com questions 7507825 python complete example of dict for logging config dictconfig但这对我不
  • 在 CSV 导出中输出列标题

    我有一个导出到 csv 文件的查询 它工作得很好 唯一我不明白的是我还需要导出列标题 并将它们显示为全名 用户名 标志和原因 下面是代码 它可以很好地导出所有行 但我不确定如何导出受尊重的行上方的列标题 header Content typ
  • 如何让 ocaml 相信两个函子实例化是相等的

    假设我有许多模块 它们都使用一种模块类型进行参数化 并且彼此之间也具有依赖关系 module type AT sig end module B A AT struct module Hash struct type t int let eq