修复 OCaml 中的数据类型

2024-01-08

Haskell 中的以下数据类型如何用 OCaml 或 SML 表示?

newtype Fix f = In (f (Fix f))

我已经在邮件列表上回答了这个问题 https://sympa.inria.fr/sympa/arc/caml-list/2012-10/msg00109.html(我必须说,我有点不高兴你在两个不同的地方提出这个问题,没有延迟几天,因为它可能会引起重复的工作),但让我们在这里重现它。

这里有一个困难,因为 OCaml 不支持更高排名 类型变量。在这份声明中,f不是“类型”,而是“类型” 运算符”(种类* -> *)。要在 OCaml 中执行相同的操作,您可以使用 函子(不是 Haskell 函子;在 OCaml 中,“函子”一词表示 可能依赖于其他模块/函子的高阶模块); 函子是更高级的。

module type ParamType = sig
  type ('a, 'b) t
end

module Fix (M : ParamType) = struct
  type 'b fix = In of ('b fix, 'b) M.t
end

module List = struct
  module Param = struct
    type ('a, 'b) t = Nil | Cons of 'b * 'a
  end
  include Fix(Param)
end

open List.Param
open List

let rec to_usual_list =
  function
  | In Nil -> []
  | In (Cons (x, xs)) -> x :: to_usual_list xs

好消息是 OCaml 还支持等递归而不是 iso-recursive 类型,它允许您删除位于以下位置的“In”包装器 每个递归层。为此,您必须编译嵌入模块 (以及所有也通过 接口)与“-rectypes”选项。然后你可以写:

module type ParamType = sig
  type ('a, 'b) t
end

module EqFix (M : ParamType) = struct
  type 'b fix = ('b fix, 'b) M.t
end

module EqList = struct
  module Param = struct
    type ('a, 'b) t = Nil | Cons of 'b * 'a
  end
  include EqFix(Param)
end

open EqList.Param

let rec to_usual_list =
  function
  | Nil -> []
  | (Cons (x, xs)) -> x :: to_usual_list xs

模块的语法相当繁重,可能看起来很可怕。如果 您坚持可以使用一流的模块来移动其中一些用途 从函子到简单函数。我选择从“简单”开始 首先的方法。

高等变量嫉妒可能是最严重的疾病 OCaml 类型的崇拜者(或出于某些(好的!)原因的 Haskellers) 来功能县的这些地方闲逛)。在实践中我们这样做 没有它不会有太多问题,但大量使用 monad 变压器确实会因为这个函子步骤而变得复杂, 这是它在这里不是很流行的原因之一。 你也可能会因为思考自己的不完美之处而分散自己的注意力。 支持它们的语言中的高级变量;这 对构造函数多态性的限制而不是任意的 类型级函数使它们的表达能力低于您的预期。 我们研究出绝对完美的高阶细节的那一天 类型抽象,也许 OCaml 会跳转到它?

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

修复 OCaml 中的数据类型 的相关文章

  • 是否有一个基于对象身份的、线程安全的记忆库?

    我知道记忆化似乎是堆栈溢出的 haskell 标签上的一个长期话题 但我think以前没有人问过这个问题 我知道 Haskell 有几个不同的 现成 记忆库 memo combinators 和 memotrie 包 利用涉及惰性无限数据结
  • 为什么《破解编码面试》这个例子的时间复杂度是O(k c^k)?

    该问题来自 破解编码面试 第 6 版 问题 V1 11 以下代码打印长度为 k 的所有字符串 其中字符 是按排序顺序排列的 它通过生成所有长度的字符串来做到这一点 k 然后检查每个是否已排序 什么是运行时间 package QVI 11 P
  • 多维数组、Vuex 和变异

    我正在尝试添加和删除存储在 Vuex 中的多维数组中的项目 数组是一组类别 每个类别又有一个子类别 无穷大 不是简单的二维数组 示例数据集是这样的 id 123 name technology parent id null children
  • 存在函数依赖关系时类型推断如何工作

    考虑下面的代码 LANGUAGE MultiParamTypeClasses FlexibleInstances FunctionalDependencies UndecidableInstances FlexibleContexts cl
  • 正则表达式引擎如何解析具有递归子模式的正则表达式?

    此正则表达式匹配回文 1 2 我无法理解它是如何工作的 递归何时结束 以及正则表达式何时从递归子模式中断并转到 part Thanks 编辑 抱歉我没有解释 2 and 1 1 指第一个子模式 对其自身 2 反向引用第二个子模式的匹配 即
  • 如何自定义 SML/NJ 交互循环?

    我是标准 ML 的新手 我正在尝试了解 SML NJ 运行时环境 我想根据我的需要调整它 具体来说 我想 默认使用 IntInf 防止它将字符串和 IntInf 截断为 70 个字符 以下是我在 8 个多小时的阅读文档和实验中发现的内容 我
  • 解析 PHOAS 表达式

    我想我理解 PHOAS 参数化高阶抽象语法 我明白了如何漂亮地打印一个表达式 参见http www reddit com r haskell comments 1mo59h phoas for free by edward kmett cc
  • 什么是阴谋地狱?

    在阅读有关 阴谋地狱 的内容时 我有点困惑 因为这个词的含义太多了 我猜最初 Cabal Hell 指的是钻石依赖问题 该问题是通过限制构建计划在每个构建计划中只有任何包的单个版本来解决的 一个包的两个不同版本不能存在于单个构建计划中 正如
  • Haskell 排列库函数 - 请澄清一下?

    这是代码permutationsHaskell 中的函数Data List module permutations a gt a permutations xs0 xs0 perms xs0 where perms perms t ts i
  • 为什么解析器组合器“seq”用“bind”和“return”定义?

    我正在读这个article http eprints nottingham ac uk 237 1 monparsing pdf关于解析器组合器并且不理解以下内容 他们说使用seq 见下文 导致解析器将嵌套元组作为结果 操作起来很混乱 se
  • 我应该对算法使用递归还是记忆化?

    如果我可以选择使用递归或记忆来解决问题 我应该使用哪一个 换句话说 如果它们都是可行的解决方案 因为它们提供了正确的输出并且可以在我正在使用的代码中合理地表达 那么我什么时候会使用其中一个而不是另一个 它们并不相互排斥 您可以同时使用它们
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 将名称绑定到值与将值分配给变量

    阅读 Bartosz Milewski 的文章完整的 https www fpcomplete com school starting with haskell basics of haskell 3 pure functions lazi
  • 如何使用 Haskell 提交 html 表单

    我知道如何使用http 管道 http hackage haskell org package http conduit 2 1 0包的 simplehttp 从 URL 检索页面 现在如果那样的话怎么办 网页有一个输入文本字段和一个提交按
  • 没有由文字“1”产生的 Num String 实例

    main do putStrLn myLast 1 2 3 4 myLast a gt a myLast x x myLast xs myLast xs 当我尝试运行此代码时 我收到此消息 没有由文字 1 产生的 Num String 实例
  • OCaml 是否具有通过引用传递的能力?

    在 C 中 程序可以向函数传递引用 而不是值 void incrementInt int x x OCaml 是否提供相同的功能 不 没有严格的等价物 有refs 它们就像指向新分配的内存的指针 还有其他复合数据类型的记录 数组 对象和值
  • 使用递归返回嵌套列表中第二小的数字

    我必须归还第二小的使用递归的 python 列表中的数字 以及no loops 我所做的是创建一个辅助函数 它返回列表中 最小 第二小的 值的元组 然后我只取tuple 1 in my second smallest func def s
  • Haskell:从后面访问列表

    今天我开始学习Haskell 我对函数式语言有点陌生 而且我非常喜欢 Haskell 然而 我有一个关于它的设计的问题困扰着我 从我到目前为止的理解来看 访问列表后面的元素似乎比访问前面的元素要复杂得多 类似于xs x where xs a
  • Firefox 书签探索未超过 Javascript 的第一级

    我已经编写了一些代码来探索我的 Firefox 书签 但我只获得了第一级书签 即我没有获得文件夹中的链接 e g 搜索引擎 雅虎网站 谷歌网站 在此示例中 我只能访问 Search engines 和 google com 不能访问 yah
  • 为什么 Haskell (Hugs) 中的 Show 实例会导致堆栈溢出错误?

    下面是 Haskell 中的多态数据类型 由 Hugs 解释 我正在尝试创建一个 Show for Equality 的实例 实例声明表示 如果类型 a 在 Show 中 则相等 a 在 Show 中 它应该以 a b 的形式打印构造函数

随机推荐

  • VSX?虚拟MX?阿尔蒂维克?虚拟现实?振动时效?!这些 PowerPC SIMD 缩写词之间有何关系?

    我听说过很多关于 Altivec 寄存器的事 但我什至没有在网上找到它POWER9 指令集架构 https www docdroid net tWT7hjD powerisa v30 pdf 在该文档中 我只在第 6 章 矢量设施 和第 7
  • 如何获取 Android 11 中已安装应用的列表

    开发者网站上描述了这一行 但我没有完全理解它 Call getInstalledApplications or getInstalledPackages Both methods should return a filtered list
  • Python 压缩子文件夹而不是整个文件夹路径

    我有一个程序可以将所有内容压缩到一个文件夹中 我没有编写这段代码 但我在网上找到了它并且我正在使用它 我打算压缩一个文件夹 例如 C folder1 folder2 folder3 我想将folder3 及其所有内容压缩到一个文件中 例如f
  • 如何列出从单个卷 ID EC2 实例创建的所有快照?

    在过去的几个月中 我们的快照备份量增加 因此我们每月在亚马逊 EC2 上的账单也随之增加 现在我想删除一些旧的 EC2 快照 所以问题是 如何使用 EC2 命令行工具查找从单个卷 ID 创建的所有快照 I tried ec2 describ
  • 访问另一个类的 Swing 组件

    我有两节课gameWindow and gameEngine 主要方法是在gameWindowclass so 是 swing GUI 代码 现在 我想访问中的 swing 组件gameEngine 怎么做 我总是得到cannot find
  • std::bit_cast 和 std::start_lifetime_as 之间有什么有用的区别吗?

    std bit cast显然是在 c 20 中引入的 和std start lifetime as被提议用于 c 23 来自P0593R5 https wg21 link p0593R5 由于它们似乎都要求所涉及的数据类型无论如何都是微不足
  • 如何在Flutter中复用非Widget类?

    我知道我们应该使用组合优于继承 https stackoverflow com a 51477727 1769177在颤振中 当我们谈论时这很有效Widgets 但是当一个类不是一个类时我该怎么办Widget 例如 我想要我的TextFie
  • 如何在代码隐藏中将 FrameworkElement.Width 属性设置为 QualifiedDouble 的值?

    我试图将我的一个控件的宽度属性设置为qualifiedDouble 如 MSDN 上所述 http msdn microsoft com en us library system windows frameworkelement width
  • Keras Embedding 层中的 mask_zero 如何工作?

    我想mask zero True当输入值为 0 时将输出 0 因此后续层可以跳过计算或其他操作 如何mask zero works 例子 data in np array 1 2 0 0 data in shape gt gt gt 1 4
  • 根据语言更改文本

    我正在使用带有语言切换器的 Wordpress 在各种语言之间进行切换 在模板中 我使用这段代码来切换硬编码文本 This is english This is another language 我有一个侧边栏 但它是通过各种小部件创建的
  • 使用 io.TextIOWrapper 包装打开的流

    如何包装一个开放的二进制流 Python 2file Python 3io BufferedReader an io BytesIO 在一个io TextIOWrapper 我正在尝试编写不改变即可工作的代码 在 Python 2 上运行
  • Xcode 6 和 Swift 中视图之间类似 Snapchat 的滑动导航)

    我一直在尝试使用滑动手势识别器和嵌入式导航控制器在我的应用程序中的视图控制器之间实现滑动导航 但它看起来与 Snapchat 的导航并不接近 实现搜索功能最有效 最合适的方法是什么 我确实是 Swift 和编程的新手 我会很感激每一个有用的
  • 找不到模块错误:没有名为“chart_studio”的模块

    I run pip install chart studio在 jupyter 笔记本中 然后运行这段代码时 import numpy as np import pandas as pd import cufflinks as cf imp
  • 如何用JQ补数字?

    我想向数字中的字符串添加前导 尾随零 结果字符串需要包含 01 或 001 而不是 1 我注意到项目https github com joelpurra jq zeros但我从包管理器 dnf fedora 安装了 jq 所以需要一些jqn
  • 绑定复选框列表

    我需要一种简单的方法来绑定复选框列表asp net C 我从数据库 Id Name 和 IsActive 中提取 3 列 Id 和 Name 我想通过它的名字就可以清楚地看出 IsActive 将用于显示选中和未选中的框 我只是想知道 数据
  • 在 Angular 2 中从子组件更新父组件属性

    我在用着 input从父组件接收属性 以便激活子组件元素之一中的 CSS 类 我能够从父母那里接收财产并激活班级 但这只有效一次 我从父级接收的属性是一个布尔数据类型 当我将其状态设置为false从子组件开始 它在父组件中不会改变 Plun
  • webpack 4 给出背景: url([object Module]) 作为背景图像

    我在设置 web pack 4 和 svg sprite loader 将 svg 图标渲染为背景图像时遇到问题 我遵循 svg sprite loader 官方文档中的这些说明 https github com kisenka svg s
  • 使用 OpenCV 和 PyAudio 同步音频和视频

    我已经让 OpenCV 和 PyAudio 都工作了 但是我不确定如何将它们同步在一起 我无法从 OpenCV 获取帧速率并测量帧时时刻刻变化的调用时间 然而 对于 PyAudio 来说 它的基础是获取一定的采样率 我如何将它们同步到相同的
  • SqlAlchemy 连接字符串[重复]

    这个问题在这里已经有答案了 我遇到了非常奇怪的问题 我使用 sqlalchemy 的解决方案无法连接到数据库 这取决于我使用的密码 例如 以下记录工作正常 PWD 123123123 USR test user SQLALCHEMY DAT
  • 修复 OCaml 中的数据类型

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