为什么在证明与 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 是唯一的选择? 的相关文章

  • 搜索重写规则

    有什么办法可以浏览或搜索重写规则吗 当我使用像这样的标志时 ddump rule firings or ddump rule rewrites我只是得到了触发的规则的名称以及它引起的重写 但没有得到实际的规则本身 理想情况下 我想通过 GH
  • 规范化且不可变的数据模型

    Haskell如何解决 规范化不可变数据结构 问题 例如 让我们考虑一个表示前女友 男友的数据结构 data Man Man name String exes Woman data Woman Woman name String exes
  • 以下两个 lambda 函数的空间复杂度

    我正在阅读以下内容 https en wikibooks org wiki Haskell Graph reduction https en wikibooks org wiki Haskell Graph reduction 其内容如下
  • 如何在 Haskell 中安装库?

    我尝试使用控制 Monad Extra andM https hackage haskell org package extra 1 7 10 docs Control Monad Extra html import Control Mon
  • Haskell 泛化问题(涉及列表理解)

    假设我想知道a上的所有要点 x y 矩形内的平面has 我可以使用列表推导式来计算 如下所示 let myFun2D x y x lt 0 2 y lt 0 2 现在 如果我想为一个人完成同样的事情 x y z 空间 我可以采取同样的方式并
  • 使用 FoldLine 解析多个块

    对于这个简化的问题 我试图解析一个如下所示的输入 foo bar baz quux woo hoo xyzzy glulx into foo bar baz quux woo hoo xyzzy glulx 我尝试过的代码如下 import
  • QuickCheck是否可以生成任意函数

    我试图为身份编写一个 QuickCheck 测试 f y f y 我最初的计划是编写一个返回函数和整数的任意生成器 具有签名Gen Int gt Int Int 并在prop DollerDoesNothing使用 不使用测试该功能应用程序
  • : 中缀运算符在 Haskell 中的作用是什么?

    我正在阅读Haskell 简要介绍 http www haskell org tutorial index html 这不是那么温和 并且它反复使用 操作符而不直接解释它的作用 那么 它到底有什么作用呢 是 前置 运算符 x xs 返回一个
  • 这个对自身单位的列表理解是如何工作的?

    在 haskell IRC 频道中有人问 是否有一种简洁的方法来定义一个列表 其中第 n 个条目是之前所有条目的平方和 我认为这听起来像一个有趣的谜题 递归定义无限列表是我真正需要练习的事情之一 所以我启动了 GHCi 并开始尝试递归定义
  • 为什么 ZipList 不是 List 的默认应用实例

    我目前正在学习 Haskell 中的应用程序 如果我没记错的话 列表有两个不同的应用实例 List and ZipList 第二个被定义为包装列表值的新类型 这ZipList应用实例对我来说似乎更直观 这可能是一个愚蠢的问题 但有具体原因吗
  • 在 monad 转换器类型类中使用列表 monad?

    我的目标是创建一个在 ReaderT WriterT 堆栈或 RWS 堆栈中使用列表 monad 的函数 更一般地说 如何在 mtl 类型类 例如 MonadReader MonadWriter 中使用列表 monad 我为什么要尝试这样做
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • Haskell:不在范围内:数据构造函数

    今天开始在学校学习 haskell 我遇到了函数问题 我不明白为什么它不在范围内 代码如下 ff Char gt Char gt Char ff A B x 0 y 1 x lt A y lt B x 1 y 0 和错误 md31 hs 2
  • Haskell Data.Decimal 作为 Aeson 类型

    是否可以解析一个数据 十进制 https hackage haskell org package Decimal 0 4 2 docs Data Decimal html使用 Aeson 包从 JSON 获取 假设我有以下 JSON foo
  • 类型级别集结合律的证明

    我试图证明类型级函数Union https hackage haskell org package type level sets 0 8 5 0 docs Data Type Set html t Union是关联的 但我不确定应该如何完
  • 迭代打印列表中的每个整数

    假设我有一个整数列表l 1 2 我想打印到stdout Doing print l产生 1 2 假设我想打印不带大括号的列表 map print l产生 No instance for Show IO arising from a use
  • RankN多态性和令人发指的克莱斯利之箭

    我不明白为什么 demobind1 的定义会产生一些编译器错误 它看起来像一个愚蠢的翻转 但不知何故 LANGUAGE GADTs LANGUAGE RankNTypes ScopedTypeVariables TypeOperators
  • Haskell 项目可以使用 cmake 吗?

    我正在计划一个用 Haskell 编写的项目 也许也有一些部分是用 C 编写的 对于构建系统 我决定不选择 Haskell 程序 cabal 的常见选择 主要是因为我想了解其他语言的构建程序是如何工作的 我听说过 CMake 我认为这是一个
  • 使用带有两个列表而不是一个列表的地图。可以筑巢吗?

    我需要多次运行一个带有两个参数的函数 我有两个包含这些参数的列表 我希望能够使用map或类似的东西用相应的参数调用函数 我要调用的函数具有以下类型 runParseTest String gt String gt IO 列表的创建方式如下
  • cabal install wx 缺少 C 库

    Env 操作系统 feodra 16 Haskell 平台 wxGTK 开发 GHHC 7 0 4 我正在尝试安装 wxHaskell 阴谋集团安装wx 然后给出这些错误 缺少对外国库的依赖 缺少 C 库 wx baseu 2 8 wx b

随机推荐

  • 其他父控制器 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