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 中附加词的用例 的相关文章

  • yesod——密码保护临时站点

    我正在尝试设置 yesod 网络服务器的临时实例 我想知道是否有一些简单的方法可以使整个站点受到密码保护 具体来说 我希望能够提示那些导航到我的网站的人提供凭据 经过身份验证后 它应该像典型站点一样运行 但如果他们无法验证自己的身份 他们就
  • 在 Haskell 中等待然后检测按键的简单方法是什么?

    我对 Haskell 还很陌生 所以我正在寻找一种简单的方法来检测按键 而不是使用getLine 如果有人知道任何库 或者知道一些这样做的技巧 那就太好了 如果有更好的地方可以问这个问题 请直接告诉我 我将不胜感激 如果您不想阻止 可以使用
  • 在 Haskell 中对单位的组成(例如英寸、美元等)进行建模

    跟进自我之前的一个问题 https stackoverflow com q 73375273 222529 我问如何创建一个可以对单元进行建模的类型 例如Inch 作为 Haskell 中的一种类型 我现在面临的问题是如何对该单元和其他单元
  • 在 Haskell 中为自定义数据类型创建 Read 类型类的实例

    我有一个自定义数据类型Foo Foo a Int b Int 我正在尝试使 Foo 成为 read 的自定义实例 我已经有一个功能了bar String gt Foo我尝试这样做 instance Read Foo a b where re
  • 不同 hs 文件中的函数分离时堆栈空间溢出

    我有一个巨大的 haskell 文件 它编译和运行没有任何问题 我想将一些函数和类型定义放在通用 hs 文件中的单独模块中 然后将其导入我的主模块中 虽然主程序编译时没有任何错误 它还编译导入的模块 但当我尝试运行它时 出现堆栈空间溢出 I
  • 谁能解释一下 GHC 对 IO 的定义吗?

    标题非常自我描述 但有一个部分引起了我的注意 newtype IO a IO State RealWorld gt State RealWorld a 剥离newtype 我们得到 State RealWorld gt State Real
  • 为什么haskell中的递归列表这么慢?

    我对 Haskell 很陌生 我在 Haskell 中定义了一个函数 febs Integral a gt a gt a febs n n lt 0 0 n 1 1 n 2 1 otherwise febs n 1 febs n 2 但是
  • 列表理解:制作列表列表

    你好 我正在尝试在 haskell 中创建一个函数 该函数接受一个数字 a 使用列表 即数字 将其一部分4它会创造 1 1 1 1 1 1 2 1 3 2 2 4 我正在考虑使用列表理解来创建列表 x 然后使用 1 n 中的数字创建更多列表
  • GHC 是否使用存在类型的动态调度?

    下面的代码是否使用了 C 或 Java 中所理解的动态调度 据我了解 在最后一行 编译器不可能在编译时知道要调用哪个 实现 但代码会编译并产生正确的结果 有人可以解释一下 这背后有什么样的实现 例如 vptr 吗 LANGUAGE Exis
  • Haskell 测量函数性能

    在 Haskell 中 我如何 简单地 测量函数的性能 例如 运行需要多长时间 或者需要多少内存 我知道分析 但是 是否有一种更简单的方法不需要我对代码进行太多更改 测量运行需要多长时间以及需要多少内存是两个独立的问题 即 基准测试和分析
  • 存在函数依赖关系时类型推断如何工作

    考虑下面的代码 LANGUAGE MultiParamTypeClasses FlexibleInstances FunctionalDependencies UndecidableInstances FlexibleContexts cl
  • Haskell 排列库函数 - 请澄清一下?

    这是代码permutationsHaskell 中的函数Data List module permutations a gt a permutations xs0 xs0 perms xs0 where perms perms t ts i
  • 简单的秒差距示例会产生类型错误

    我正在尝试编译这个简单的秒差距代码 import Text Parsec simple letter 但我不断收到此错误 No instance for Stream s0 m0 Char arising from a use of let
  • 如何避免编写这种类型的 Haskell 样板代码

    我经常遇到这种情况 这很烦人 假设我有一个 sum 类型 它可以保存一个实例x或一堆其他无关的事情x data Foo x X x Y Int Z String other constructors not involving x 要声明
  • 类型级编程有哪些示例? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我不明白 类型级编程 是什么意思 也无法使用Google找到合适的解释 有人可以提供一个演示类型级编程的示例吗 范式的解释和 或定义将
  • Parsec 函数“parse”和类“Stream”的类型签名

    约束条件是什么 Stream s Identity t 下面的类型声明是什么意思 parse Stream s Identity t gt Parsec s a gt SourceName gt s gt Either ParseError
  • 没有由文字“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 实例
  • 在一元上下文中使用 Data.Map

    我正在操作的地图具有单子键 类型为IO Double 我需要使用findMax在这张地图上 我可以用吗liftM为了这 Map findMax Map fromList f x X f y Y f z Z Here f x有类型IO Dou
  • Haskell 中实例声明的参数顺序切换

    我想进行实例声明 但自由类型变量不是最后一个变量 例如 我有一个类声明 class Poppable m where tryPop m a gt Maybe a m a 现在我想让 Q PSQ 优先级队列 成为 Poppable 的实例 具
  • 为什么 Haskell (Hugs) 中的 Show 实例会导致堆栈溢出错误?

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

随机推荐

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

    我的应用程序提取数据并将其附加到文本文件中 但我需要了解如何以编程方式查看文本文件的第一行并查看它是否与以下文本匹配 日期时间 虚拟 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