Haskell 中附加词的用例

2024-01-19

我一直在阅读附加语 https://en.wikipedia.org/wiki/Adjoint_functors在过去的几天里。当我开始从理论角度理解它们的重要性时,我想知道人们如何以及为什么在 Haskell 中使用它们。Data.Functor.Adjunction http://hackage.haskell.org/package/adjunctions-4.4/docs/Data-Functor-Adjunction.html提供了一个实现,其实例包括自由函子/健忘 http://hackage.haskell.org/package/adjunctions-4.4/docs/src/Data-Functor-Adjunction.html#line-197函子和咖喱/咖喱 http://hackage.haskell.org/package/adjunctions-4.4/docs/src/Data-Functor-Adjunction.html#line-163。同样,从理论角度来看,这些非常有趣,但我不知道如何将它们用于更实际的编程问题。

是否有人们使用解决的编程问题的例子Data.Functor.Adjunction为什么您更喜欢这种实现而不是其他实现?


初步说明:这个答案有点推测性。就像这个问题一样,它是通过研究而建立的Data.Functor.Adjunction.

我可以想到为什么没有太多用例的三个原因Adjunction在野外上课。

首先,所有 Hask/Hask 附加项最终都是柯里化附加项的某种变体,因此潜在实例的范围一开始并不是那么大。人们可能感兴趣的许多附加功能并不是 Hask/Hask。

其次,虽然Adjunction坦率地说,实例免费为您提供了大量其他实例,在许多情况下,这些实例已经存在于其他地方。要选择 ur-example,我们可以很容易地实现StateT按照Control.Monad.Trans.Adjoint http://hackage.haskell.org/package/adjunctions-4.4/docs/Control-Monad-Trans-Adjoint.html:

newtype StateT s m a = StateT { runStateT :: s -> m (s, a) }
  deriving (Functor, Applicative, Monad) via AdjointT ((,) s) ((->) s) m
  deriving MonadTrans via AdjointT ((,) s) ((->) s)
  -- There is also a straightforward, fairly general way to implement MonadState.

然而,没有人需要真正这样做,因为有一个非常好的方法StateT in 变形金刚。也就是说,如果您确实有Adjunction你自己的例子,你可能很幸运。我想到的一件可能有意义的小事(即使我还没有真正看到它)是以下函子:

data Dilemma a = Dilemma { fstDil :: a, sndDil a }

data ChoiceF a = Fst a | Snd a

我们可能会写一个Adjunction ChoiceF Dilemma实例,反映了如何Dilemma (ChoiceF a)是物化版本State Bool a. Dilemma (ChoiceF a)可以被认为是决策树中的一个步骤:选择决策树的一侧Dilemma告诉你,通过ChoiceF构造者,接下来要做出什么选择。这Adjunction然后实例会给我们一个 monad 转换器Dilemma (ChoiceF a)免费。

(另一种可能性可能是利用the Free f/Cofree u附加 https://hackage.haskell.org/package/adjunctions-4.4/docs/Data-Functor-Adjunction.html#t:Adjunction. Cofree Dilemma a是一个无限的结果树,而Free ChoiceF a是一条通往结果的道路。我敢说还有一些里程可以摆脱这种情况。)

第三,虽然右伴随有许多有用的函数Data.Functor.Adjunction,它们提供的大部分功能也可以通过Representable and/or Distributive,因此大多数可能使用它们的地方最终都会坚持使用超类。

Data.Functor.Adjunction当然,还提供了有用的功能left伴随物。一方面,左伴随(与对同构,即包含单个元素的容器)可能不如右伴随(与函数同构,即具有单一形状的函子)通用;另一方面,似乎没有任何左伴随的规范类(至少还没有),因此这可能会导致实际使用的机会Data.Functor.Adjunction功能。顺便,克里斯·彭纳的战舰示例 https://chrispenner.ca/posts/adjunction-battleship您的建议可以说符合要求,因为它确实依赖于左伴随以及如何使用它来编码右伴随的表示:

zapWithAdjunction :: Adjunction f u => (a -> b -> c) -> u a -> f b -> c
zapWithAdjunction @CoordF @Board :: (a -> b -> c) -> Board a -> CoordF b -> c

checkHit :: Vessel -> Weapon -> Bool

shoot :: Board Vessel -> CoordF Weapon -> Bool

CoordF,左伴随,携带板的坐标和有效负载。zapWithAdjunction使得在使用有效载荷时能够(从字面上看,在这种情况下)定位位置。

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

Haskell 中附加词的用例 的相关文章

随机推荐

  • 在文本文件顶部添加一行

    我的应用程序提取数据并将其附加到文本文件中 但我需要了解如何以编程方式查看文本文件的第一行并查看它是否与以下文本匹配 日期时间 虚拟 IP 虚拟端口 虚拟名称 目标 IP 目标端口 状态 所需 如果确实如此 则继续执行正常功能 下面的片段
  • 如何使用 JavaScript 获取文本字段的值? (jQuery)

    我正在尝试使用 jQuery 获取文本字段的值 但它不起作用 下面是测试 我在 HTML 中有这个
  • Python:从列表中获取多个列表[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Python 中将列表分割成大小均匀的块 https stackoverflow com questions 312443 how do you split a list into evenl
  • 无法中断 lock.acquire() 而我可以中断 time.sleep()

    在 Windows 中 Python 3 4 import threading l threading Lock l acquire l acquire 触发死锁 并且 CTRL C 无法阻止它 你必须杀死该进程 另一方面 import t
  • 如何执行 UITableViewCell 的自定义移动?

    我想像这两种方法一样移动单元格 void tableView UITableView tableView moveRowAtIndexPath NSIndexPath fromIndexPath toIndexPath NSIndexPat
  • gensim word2vec - 使用在线词嵌入更新数组维度

    gensim 0 13 4 1 中的 Word2Vec 无法动态更新词向量 model build vocab sentences update False 工作正常 然而 model build vocab sentences updat
  • Rails 3 模型将某些列映射到不同的模型属性

    我有一个名为 DXFTACCTS 的旧旧表 并且创建了 Rails 模型 Account class Account lt ActiveRecord Base set table name DXFTACCTS end 问题是 DXFTACC
  • Python——函数不返回值

    我想编写一个函数来比较两个值 val1和val2 如果val1大于val2 则为a points添加1分 像A队一样 反之亦然 如果val2更大 则为b points添加1分 如果这两个值是偶数 我不会向 a points 或 b poin
  • NDK/JNI:识别当前线程

    在JNI本地方法中 有没有一种方法可以在不回调Java的情况下知道当前线程的ID 线程本地存储也可以工作 编辑 pthread h 存在于 NDK 包含文件夹中 有谁知道 Java 线程是否对应于 NDK 实现中的 POSIX 线程 您对哪
  • 在编译过程中如何查看解析树、中间代码、优化代码和汇编代码?

    我正在学习编译器课程 程序的编译遵循以下步骤 词法分析 语法分析 语义分析 中间代码生成 代码优化 目标代码生成 如何查看每个步骤的输出 例如我想在语法分析后查看解析树 我正在使用 GCC 编译器在 Linux 机器上编译程序 我们可以使用
  • Gitlab-CI 中的上游触发(又名管道依赖项)

    我似乎无法从这样的工具中找到最明显的 CI 功能 在另一个项目的管道完成后运行项目管道 你可以这样做trigger但仅适用于下游触发 这与您想要的相反 如果您有一个项目是 20 个其他项目的核心依赖项 而这些项目都需要重建 在这种情况下 您
  • 如何在 python 上解决 TISE 的简单边值问题

    我正在尝试求解无限势阱的 TISEV 0在间隔上 0 L 这个练习给我们提供了波函数及其导数的值0 is 0 1分别 这使我们能够使用scipy integrate odeint函数来解决给定能量值的问题 现在的任务是在给定波函数的进一步边
  • “The fi bug” 一个奇怪的 iOS 7 归因文本错误

    我在 iOS 7 中遇到了一个奇怪的错误 我称之为 fi bug 抽象的 两个字符 fi 被视为一个字符 解释 我创建了一个 UILabel 其中包含一个单词 作为属性文本 我创建了一个函数 单击时会将单词的一个字符着色为蓝色 即首先单击它
  • LR(0) 解析器如何离开状态 0?

    我已经阅读了维基百科的解释至少十几次 但我仍然对 LR 0 解析器如何离开状态 0 感到困惑 维基百科的例子及其解释说 http en wikipedia org wiki LR parser Parsing Steps 解析器从仅包含初始
  • 如何在java中找到像2^(10^9)这样的数字的幂[重复]

    这个问题在这里已经有答案了 Math pow 返回一个 double 值并且只接受 int 作为参数 BigInteger 作为没有查找 BigInteger BigInteger 的函数 通过循环来完成它需要很长时间 我还有什么想念的吗
  • toggleClass() 在 Angular 4 中不起作用

    我已经添加jQuery在脚本中并使用 import as from jquery 以及 我还添加了jQuery在 HTML 文件中 But my toggleClass 功能不起作用 当我检查控制台时 没有显示任何错误 它只是空的 下面是我
  • Xamarin 表单:可以在内容页上以编程方式在 Shell 应用程序中添加选项卡

    我通过谷歌查找但找不到结果 我有一个 Shell 设置 Xamarin 表单应用程序 尽管我没有完全使用它的功能 但 xaml 文件中有一个选项卡设置 我想知道我是否可以在 shellContent 下托管一个内容页面并从 contentP
  • 一次使用共享内存的多个实例

    为了在记录程序和显示程序 不能相同 之间传输视频流 我使用共享内存 为了同步访问 我组合了一个类 它包装了一个shared memory object 一个mapped region和一个interprocess sharable mute
  • Javascript“addEventListener”事件在页面加载时触发[重复]

    这个问题在这里已经有答案了 当我运行以下脚本时 该事件始终在页面加载时触发 我不确定我在这里做错了什么 我创建了元素 在 DOM 中找到它 然后附加一个侦听器 但它总是在页面加载时触发事件 而不是在单击元素时触发事件
  • Haskell 中附加词的用例

    我一直在阅读附加语 https en wikipedia org wiki Adjoint functors在过去的几天里 当我开始从理论角度理解它们的重要性时 我想知道人们如何以及为什么在 Haskell 中使用它们 Data Funct