如何指定两个操作在类型类中交换?

2024-04-16

我开始读书这篇关于 CRDT 的论文 http://pagesperso-systeme.lip6.fr/Marc.Shapiro/papers/RR-6956.pdf,这是一种通过确保修改数据的操作是可交换的来同时共享可修改数据的方法。在我看来,这将是 Haskell 中抽象的一个很好的候选者 - 为 CRDT 提供一个类型类,指定数据类型和在该类型上交换的操作,然后致力于使库能够在并发进程之间实际共享更新。

我不明白的是如何在类型类的规范中表达操作必须交换的契约。

举个简单的例子:

class Direction a where
  turnLeft :: a -> a
  turnRight :: a -> a

无法保证turnLeft . turnRight是相同的turnRight . turnLeft。我认为后备方法是指定 monad 法则的等效项 - 使用注释来指定类型系统未强制执行的约束。


你想要的是一个包含证明负担的类型类,类似于下面的伪 Haskell:

class Direction a where
    turnLeft  :: a -> a
    turnRight :: a -> a
    proofburden (forall a. turnLeft (turnRight a) === turnRight (turnLeft a))

这里所有实例都必须提供函数和证明供编译器进行类型检查。 (对于 Haskell 来说)这是一厢情愿的想法,因为 Haskell 没有(好吧,有限的)证明概念。

OTOH,Coq 是一种可以提取到 Haskell 的依赖类型语言的证明助手。虽然我从未使用过Coq 的类型类 http://coq.inria.fr/refman/Reference-Manual024.html之前,快速搜索是富有成效的,例如:

Class EqDec (A : Type) := {
   eqb : A -> A -> bool ;
   eqb_leibniz : forall x y, eqb x y = true -> x = y }.

所以它看起来像高级语言can这样做,但是在降低标准开发人员的学习曲线方面可以说还有很多工作要做。

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

如何指定两个操作在类型类中交换? 的相关文章

随机推荐

  • Excel 2010 VBA ActiveChart.SetSourceData 失败

    我有一个 Excel VBA 应用程序 该应用程序在 Excel 2003 中运行良好 但在 Excel 2010 中失败 相关代码为 Public Sub Create Chart Dim c Dim OutputText As Stri
  • JUnit 测试时排除 @Component 类的过滤器?

    是否可以排除 Component带注释的类 我想从 JUnit 测试中排除一个特殊的类 我的项目有一个类xEventHandler注释为 Component我不希望 spring 在 junit 测试时使用这个类 我的应用程序 TestCo
  • 按 2 个键对 FireBase 中的数据进行排序

    我构建了游戏应用程序 并将记录保存在 FireBase 的实时数据库中 数据库看看 Ka8xxTgyFB8yYKH50j score 10 seconds 1325 K222xTgyFBF33FD50j score 10 seconds 4
  • 如何使用更少的包绘制二元正态分布的表面和轮廓

    我将绘制二元正态分布的 3D 曲面及其轮廓 可以是任何二元正态分布 我想用persp and contour在我的画中 我在网上搜索了一下 但发现了很多方法 大多数人都使用过一些软件包 但我想以使用更少的软件包甚至不安装任何软件包的方式来执
  • R:rJava 包安装失败

    使用以下命令安装 rJava 时install packages rJava 命令我收到以下错误 checking Java support in R present interpreter usr bin java archiver us
  • 为什么我在比较 Perl 中输入的行时遇到问题?

    我不知道这个简单的交易可能做错了什么 但它不起作用 print OK y or n n ans lt gt print n if ans eq y print ans 我基本上想知道如何测试用户输入 这点代码对我来说不起作用 我只是想打印
  • 嵌套 Javascript Promise - 从 firestore 获取数据

    在过去的三天里 我一直被这个错误困扰 我已经尝试了几乎所有的方法 尝试以 1000 种方式构建承诺 但似乎没有任何效果 也许我正在失去 大局 所以希望新的眼睛能有所帮助 谢谢阅读 我有一个在 Firebase Cloud Functions
  • Angular CLI 可执行文件 (ng) 始终仅显示可用命令的列表

    视窗 角 电子邮件受保护 cdn cgi l email protection节点 v 16 13 1 npm v 8 1 2 ng command 在 Windows CMD 中总是给出可用命令的列表 就像在这样的情况下 ng 但如果我使
  • 如何在本地主机中为 XAMPP 创建有效的 SSL [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我如何使用安全连接 SSL in my XAMPP在窗口中 当我打开 localhost 页面时出现以下错误 连接不安全 在我的 XAMP
  • Protractor:彻底清除浏览数据

    我正在寻找一种使用 Protractor 完全删除所有 cookie 会话 状态 cookie 存储等的方法 基本上 我想在量角器中完成与用户相同的事情 方法是转到 设置 gt 清除浏览数据 browser manage deleteAll
  • CsvHelper 更改日期和时间的输出方式

    我在用CSV助手 https joshclose github io CsvHelper 编写一些 CSV 文件 并希望将日期和时间的格式更改为特定的格式 遵循以下建议https stackoverflow com a 31817621 2
  • React-Native:从剪贴板设置和获取文本时出错

    import React useState from react import SafeAreaView View Text TouchableOpacity StyleSheet from react native import Clip
  • 分类变量的多重共线性

    对于数值 连续数据 为了检测预测变量之间的共线性 我们使用皮尔逊相关系数并确保预测变量之间不相关 但与响应变量相关 但我们怎样才能检测到多重共线性如果我们有一个数据集 其中预测变量都是绝对的 我正在共享一个数据集 我试图找出预测变量是否相关
  • 在 VB.NET 中防止 Math.Round(95.55555555,2) 四舍五入到 95.56

    If I do Math Round 95 55555555 2 在 VB NET 中 结果是95 56 但我希望结果是95 55 有没有办法在 VB NET 中做到这一点 我想我只是想保留小数位 而不是四舍五入 好像Math Trunca
  • 使用 PATH 列出 MediaStore 中的所有音乐

    好吧 我已经在这个项目上工作了几天 我的大部分时间都在研究如何在列表视图或其他东西中列出设备上的所有音乐 我已经搜索了几天并且这简直要了我的命 我确实一度非常接近显示一个文件夹中的所有音乐 但由于大多数人都会有像 artiest 和专辑这样
  • MySQL中如何压缩列?

    我有一个存储电子邮件通信的表 每当有人 回复 整个路径也被包含并保存到 数据库 我需要这样 因为应用程序的数量 级别更改以纠正太高的情况 尺寸mail文本列是10000 但是 我在存储文本时遇到的困难还不止这些 由于我不确定可以发生多少个通
  • 图库的 xml 树解析器 (Haskell)

    我正在编写一个用于处理图形的库 主要任务 解析 xml tree 这棵树看起来像
  • 使网页浏览器的背景透明

    我试图使我的网络浏览器的背景像android中的wb setBackground Color transparent 一样透明 有可能吗 thanks Renaud WebBrowser 控件不是真正的 Silverlight 控件 因此不
  • 如何在汇编器中实现相对 JMP (x86)?

    在为 x86 平台构建汇编程序时 我遇到了一些编码问题JMP操作说明 OPCODE INSTRUCTION SIZE EB cb JMP rel8 2 E9 cw JMP rel16 4 because of 0x66 16 bit pre
  • 如何指定两个操作在类型类中交换?

    我开始读书这篇关于 CRDT 的论文 http pagesperso systeme lip6 fr Marc Shapiro papers RR 6956 pdf 这是一种通过确保修改数据的操作是可交换的来同时共享可修改数据的方法 在我看