为什么在证明与 Monad 等价时,ArrowApply 是唯一的选择?

2024-01-11

Under 这个问题 https://stackoverflow.com/questions/59869399/why-does-mutual-yielding-make-arrowapply-and-monads-equivalent-unlike-arrow-and, 左转 https://stackoverflow.com/users/745903/leftaroundabout left 一个非常清楚的解释 https://stackoverflow.com/a/59897265/11143763 why we actually考虑ArrowApply and Monad相等的。

这个想法是在往返过程中不丢失任何信息:

arrAsFunction :: Arrow k => k x y -> (x -> k () y)
arrAsFunction φ x = φ <<< arr (const x)

retrieveArrowFromFunction :: ∀ k x y .
          ArrowApply k => (x -> k () y) -> k x y
retrieveArrowFromFunction f = arr f' >>> app
 where f' :: x -> (k () y, ())
       f' x = (f x, ())

我(可能)明白,为什么我们开始谈论(x -> k () y)- 一个包裹着的\ ~() -> ...不会产生大箭头,因此我们希望它取决于环境。

我的问题是:我们如何确定以下函数不存在:

retrieveArrowFromFunction :: ∀ k x y .
          Arrow k => (x -> k () y) -> k x y

我尝试想出一些箭头,这会弄乱该类型的库里-霍华德对应关系。这是正确的引导吗?可以更容易地完成吗?


这是一个非常简单的箭头。你可能会认为它是一个Writer类似幺半群上的箭头Any.

newtype K a b = K Bool

instance Category K where
    id = K False
    K x . K y = K (x || y)

instance Arrow K where
    arr _ = K False
    K x *** K y = K (x || y)

如果你研究这些定义的后果,你会发现first and second改变箭头的类型而不改变所包含的内容Bool。这意味着我们无法创建一个合法的ArrowApply实例。下面的定律决定了我们必须选择app = K False:

first (arr (...)) >>> app = id

但遵循以下规律,选择g = K True,决定了我们必须选择app = K True:

first (arr (...)) >>> app = second g >>> app

矛盾。

将此观察提升到您的直接问题,我们无法定义

retrieve :: (x -> K () y) -> K x y

以不丢失信息的方式。事实上,我们甚至无法定义更单态(因此更容易实现)的函数

retrieveMono :: (Bool -> K () ()) -> K Bool ()

以不丢失信息的方式:参数类型有 4 个居民,而返回类型只有 2 个居民。

Addendum

你可能想知道我是如何想出这个反例的。在我看来,问题的核心是是否存在Arrow这也不是一个ArrowApply。我记得第一篇关于箭头的论文,将单子推广到箭头 http://www.cse.chalmers.se/%7Erjmh/Papers/arrows.pdf约翰·休斯 (John Hughes) 提出了一个激励性的例子,一个箭头不能成为单子(因此也不能是单子)ArrowApply实例)。我翻出了这篇论文,回顾了解析箭头的定义,并将其归结为使它不可能变成一个ArrowApply或单子:我扔掉了箭头的类似函数的部分,观察到它的其余部分充当了一个奇特类型的幺半群,并选择了我能想到的最简单的非平凡幺半群来取代论文中令人兴奋的幺半群。

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

为什么在证明与 Monad 等价时,ArrowApply 是唯一的选择? 的相关文章

随机推荐

  • 其他父控制器 Rails 3.1 内的控制器的自定义验证错误

    我的 Rails 应用程序中有一个 House 模型 它有很多交易 我正在房子的展示页面上显示这些优惠 当我提交表单时 如果使用redirect to 一切正常 但是 如果交易模型存在验证错误 那么我的系统将无法正常工作 交易模型是否存在验
  • MATLAB - 重新定义 YTickLabel

    我在 MATLAB 中编辑颜色条时遇到问题 颜色条已绘制 我想在 YTickLabels 上添加特定测量的单位 dB 这是通过以下命令完成的 cy get ch YTickLabel set ch YTickLabel set ch YTi
  • 如何在 data.table 中以编程方式选择列?

    我有以下数据表 DT DT lt data table V1 1 3 V2 4 6 V3 7 9 我想通过使用存储相关变量名称的对象以编程方式 动态 选择变量的子集 例如 我想选择存储在变量 keep 中的两列 V1 和 V3 keep l
  • 在没有 Azure Front Door 的情况下使用 Azure AD B2C 自定义域

    我想将自定义域与 Azure AD B2C 结合使用 正如 Microsoft 文档中所述 需要使用 Azure Front Door 来执行此操作 为了避免为此服务付费 我想使用我自己的网络服务器 反向代理 Nginx 来执行此操作 我不
  • 如何在 R 中发送读取 csv 的电子邮件并一次发送多封电子邮件?

    我有包含电子邮件的 CSV 文件 如何在 r 中发送多封电子邮件 错误1 send mail 函数不采用 data frame 值 Error in FUN X i Sorry parameter type NA is ambiguous
  • Rstudio 中的拼写检查

    如何在 Rstudio 中配置和使用拼写检查 在工具 gt 全局选项 gt 拼写中 我已将主要词典语言设置为英语 美国 将自定义词典设置为 usr lib rstudio resources dictionaries en US dic 中
  • 添加多个类 html [重复]

    这个问题在这里已经有答案了 是否可以在html中添加多个类 这是我尝试过的 a href class class2 My Text a 谢谢 是的 这是可能的 但您只能声明class每个 HTML 元素一次属性 只需用空格分隔您要应用的类即
  • 将 Excel 工作表行转换为单独的 XML 文件时出现运行时错误

    我想每行导出一个 xml 文件 请参阅打印屏幕中的示例 我收到以下错误 运行时错误 2147024891 80070005 系统错误 2147024891 on doc Save sFile 我使用以下代码读取 Excel 工作表 Micr
  • SSRS 2008 - 报告标题未显示动态数据

    我有一份按部门名称排序的人事报告 但是当我将部门名称字段添加到标题中时 它只正确打印出第一个部门名称 其他每个页面都有标题 但标题中仍然有初始部门名称 而不是正确的部门名称 换句话说 报表标题中对部门名称的字段引用不会更新 我浏览了存储过程
  • 捕获 TextArea 中的选项卡

    有谁知道一个跨浏览器 可靠的解决方案来捕获文本区域字段中 Tab 键的按下 并替换 在正确的位置 4 个空格 文本区域用于输入文章 需要此功能 注意 我尝试使用 FCKEditor 等 它没有捕获选项卡 并且有很多我不需要的功能 我想要一个
  • useBean 类属性的值...无效[重复]

    这个问题在这里已经有答案了 我想使用 Java 文件SaveProp这是写在一个包中的user 类文件已放置在WEBINF classes 下面是导致问题的两行 jsp useBean id user class user SaveProp
  • 为什么有时可以将 NSArray 转换为 NSMutableArray,有时却不能?

    具体来说 self words NSMutableArray self text componentsSeparatedByString 只要有分隔符就可以正常工作 我看到该方法返回包含在 NSArray 中的原始字符串 如果没有 这个单一
  • 淘汰赛JS动态图表与highcharts

    所以 过去一周我一直在打高排行榜和KO 高图表的语法非常简单且易于阅读 我来自 Java 对 JS 还很陌生 所以我不确定如何真正使用这个范围 有没有办法使用淘汰赛或将淘汰赛与高图表结合起来轻松制作动态图表 我可以简单地将它们放在同一个 J
  • 在 Windows 上使用 AMD64 版本的 Scipy 调用 scikit-learn 时出错

    我在这一行收到此错误 from sklearn ensemble import RandomForestClassifier 错误日志是 Traceback most recent call last File C workspace Ka
  • 如何将 Electron 应用程序和 Windows 服务捆绑在一起?

    我对电子应用非常陌生 我需要一些帮助选举装置 我有一个电子桌面应用程序 and a 窗口服务 我可以使用以下命令启动和停止预安装的服务sudo prompt包裹 我正在创造视窗安装程序通过使用electron winstaller包裹 但我
  • 函数指针的取消引用是如何发生的?

    为什么以及如何取消引用函数指针 什么也不做 这就是我要说的 include
  • 如何处理 React 中对 setState 的异步调用?

    我有一个方法可以通过复制值然后更新状态来切换状态中的布尔值 toggleSelected gt let selected this state lists selected selected selected this setState u
  • 错误:找不到模块“readline-sync”:Node.js

    我以前从未使用过node js 并且一直在研究这个问题的答案 但我没有运气 我试图允许用户输入一个输入数字 老实说 我不知道如何做到这一点 经过一些研究 我测试了一个非常简单的输入 输出代码 var readline require rea
  • Crystal Reports - 水平页码

    使用 Crystal Reports Developer XI 我有一个交叉表报告 交叉表可以水平跨越多个页面 对于 10 页宽 3 页长的报告 我将页码显示为 1 1 of 3 到 3 10 of 3 但我希望能够将它们显示为 1 of
  • 为什么在证明与 Monad 等价时,ArrowApply 是唯一的选择?

    Under 这个问题 https stackoverflow com questions 59869399 why does mutual yielding make arrowapply and monads equivalent unl