在 Haskell 中提升高阶函数

2023-11-29

我正在尝试构造一个类型的函数:

liftSumthing :: ((a -> m b) -> m b) -> (a -> t m b) -> t m b

where t是一个 Monad 转换器。具体来说,我有兴趣这样做:

liftSumthingIO :: MonadIO m => ((a -> IO b) -> IO b) -> (a -> m b) -> m b

我摆弄了一些 Haskell 魔法库,但没有成功。我怎样才能得到它 对吧,或者也许有一个我没有找到的现成解决方案?


这不能普遍地完成MonadIO实例是因为IO键入负数位置。 hackage 上有一些库可以针对特定实例执行此操作(单子控制, 单子皮),但是关于它们在语义上是否合理存在一些争论,特别是关于它们如何处理异常和类似的奇怪问题IO你的事情。

编辑:有些人似乎对积极/消极立场的区别感兴趣。实际上,没什么可说的(您可能已经听过它,但名称不同)。该术语来自子类型领域。

子类型化背后的直觉是“a是一个子类型b(我会写a <= b)当a可以在任何地方使用b相反,“是预期的”。在很多情况下,决定子类型很简单;对于产品,(a1, a2) <= (b1, b2)每当a1 <= b1 and a2 <= b2例如,这是一个非常简单的规则。但也有一些棘手的情况;例如,我们什么时候应该决定a1 -> a2 <= b1 -> b2?

好吧,我们有一个函数f :: a1 -> a2和一个期望类型函数的上下文b1 -> b2。所以上下文将使用f的返回值就好像它是b2,因此我们必须要求a2 <= b2。棘手的是上下文将提供f with a b1, 虽然f将像使用它一样使用它a1。因此,我们必须要求b1 <= a1——这与你可能猜到的相反!我们这么说a2 and b2是“协变的”,或者出现在“正位置”,并且a1 and b1是“逆变的”,或者出现在“负位置”。

(顺便说一句:为什么是“正”和“负”?它是由乘法驱动的。考虑这两种类型:

f1 :: ((a1 -> b1) -> c1) -> (d1 -> e1)
f2 :: ((a2 -> b2) -> c2) -> (d2 -> e2)

什么时候应该f1的类型是 的子类型f2的类型?我陈述这些事实(练习:使用上面的规则检查这一点):

  • 我们本应该e1 <= e2.
  • 我们本应该d2 <= d1.
  • 我们本应该c2 <= c1.
  • 我们本应该b1 <= b2.
  • 我们本应该a2 <= a1.

e1处于积极的位置d1 -> e1,这又在类型中处于正位置f1;而且,e1在该类型中处于积极位置f1总体而言(因为根据上述事实,它是协变的)。它在整个项中的位置是其在每个子项中的位置的乘积:正 * 正 = 正。相似地,d1处于消极位置d1 -> e1,在整个类型中处于积极的位置。负数 * 正数 = 负数,并且d变量确实是逆变的。b1在类型中处于正位置a1 -> b1,它处于负位置(a1 -> b1) -> c1,在整个类型中处于负数位置。正 * 负 * 负 = 正,并且它是协变的。你明白了。)

现在,让我们来看看MonadIO class:

class Monad m => MonadIO m where
    liftIO :: IO a -> m a

我们可以将其视为子类型的显式声明:我们提供了一种方法来使IO a是一个子类型m a对于一些混凝土m。我们立刻就知道我们可以使用任何值IO构造函数处于积极位置并将它们变成ms。但仅此而已:我们没有办法变得消极IO构造函数进入ms——我们需要一个更有趣的类。

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

在 Haskell 中提升高阶函数 的相关文章

  • 模式匹配中的 Monoid mempty

    我尝试写一个通用的maximum功能类似于Prelude 我的第一个天真的方法如下所示 maximum F Foldable a Ord b gt a b gt Maybe b maximum mempty Nothing maximum
  • yesod——密码保护临时站点

    我正在尝试设置 yesod 网络服务器的临时实例 我想知道是否有一些简单的方法可以使整个站点受到密码保护 具体来说 我希望能够提示那些导航到我的网站的人提供凭据 经过身份验证后 它应该像典型站点一样运行 但如果他们无法验证自己的身份 他们就
  • 在生成此 SOP 函数时,如何修复类型错误,包括“无法对 Traversable 进行量化”?

    我只是说我什至不确定这是否可能 这是迄今为止我在 Haskell 中尝试过的最通用的事情 我正在尝试制作一个更通用的版本applyFunc在发现https stackoverflow com a 58890226 3096687 https
  • 在 Haskell 中为自定义数据类型创建 Read 类型类的实例

    我有一个自定义数据类型Foo Foo a Int b Int 我正在尝试使 Foo 成为 read 的自定义实例 我已经有一个功能了bar String gt Foo我尝试这样做 instance Read Foo a b where re
  • Haskell 单例:我们可以通过 SNat 获得什么

    我正在尝试使用 Haskell 单例 在论文中使用单例进行依赖类型编程 http cs brynmawr edu rae papers 2012 singletons paper pdf并在他的博客文章中单例 v0 9 发布 https t
  • 副作用是纯函数中找不到的一切吗?

    可以肯定地说 以下二分法成立 每个给定的函数是 要么纯粹 或有副作用 如果是这样 函数的 副作用就是纯函数中找不到的任何东西 这很大程度上取决于您选择的定义 可以公平地说 函数是pure or impure 纯函数始终返回相同的结果并且不会
  • Haskell,范围缩小到无步骤[重复]

    这个问题在这里已经有答案了 为什么在 Haskell 中工作范围不能降低到没有步骤 7 1 gt 但只工作这个 7 6 1 gt 7 6 5 4 3 2 1 Haskell 无法知道您想要执行 1 除非您给出提示 在某些情况下 您可能需要一
  • Haskell printf 转字符串

    Haskell 中有等效的 sprintf 吗 我需要将双精度值转换并格式化为字符串 有没有其他方法而不使用printf什么样的功能 主要问题是要避免 Prelude gt putStrLn myDoubleVal 1 7944444444
  • 如何在 Haskell 中枚举递归数据类型?

    这篇博文 http lukepalmer wordpress com 2008 05 02 enumerating a context free language 对于如何使用 Omega monad 对角枚举任意语法有一个有趣的解释 他提
  • 如何、为什么以及何时使用“.Internal”模块模式?

    我在上面看到了几个包裹hackage http hackage haskell org packages archive pkg list html其中包含模块名称 Internal作为他们的姓氏组成部分 例如Data ByteString
  • 'lens' 的阴谋集团依赖性解析失败

    我刚刚做了一个阴谋更新并尝试从 hackage 安装 lens 这给了我以下错误 cabal install j lens Resolving dependencies Configuring dlist 0 7 0 1
  • “反向”使用 Maybe Monad

    假设我有很多功能 f a gt Maybe a g a gt Maybe a h a gt Maybe a 我想按以下方式组合它们 如果 f 返回 Nothing 则计算 g 如果 g 返回 Nothing 则计算 h 如果其中任何一个计算
  • 为什么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 但是
  • 我应该使用镜头中的什么来按索引构建只读吸气剂?

    我有一个内部细节被隐藏的类型 我想提供某种镜头 可以在特定索引处读取所述类型的元素 但是not修改它们 一个Ixed我的类型的实例似乎没有做我想要的事情 因为它明确允许修改 尽管不允许插入或删除 如果我想允许只读索引 我不确定我使用什么 如
  • Haskell 错误处理方法

    毫无疑问 Haskell 中有多种机制来处理错误并正确处理它们 错误单子 要么 也许 异常等 那么为什么用其他语言编写容易出现异常的代码比用 Haskell 感觉更简单呢 假设我想编写一个命令行工具来处理命令行上传递的文件 我想 验证提供的
  • 有没有办法在 Emacs 中使用 Djinn 自动生成 Haskell 代码?

    标题几乎说明了一切 我正在寻找这样的东西 f Int gt Bool gt Int f body Djinn 可以使用定理证明来通过证明该类型存在来生成此类函数的代码 我想知道 是否有现有的方法可以从 Emacs 中获取此功能 因此 我不需
  • 有什么方法可以在 do / while / let 块中打印出变量的类型吗?

    有没有办法打印出嵌套变量的推断类型ghci 考虑代码 let f g where g x Int x 那么 最好查询一下类型g e g t f g会打印出Int gt Int 您可以通过给出适当的错误类型注释并检查错误消息来诱骗此信息 Ma
  • 简单的秒差距示例会产生类型错误

    我正在尝试编译这个简单的秒差距代码 import Text Parsec simple letter 但我不断收到此错误 No instance for Stream s0 m0 Char arising from a use of let
  • 为什么 Haskell 中的点是从右向左排列的?

    如果我们有两个函数 f and g 然后在哈斯克尔h f g相当于h x f g x IE 这些函数从右到左应用于输入 有什么根本原因可以解释为什么它是从右到左 而不是从左到右吗 IE 他们为什么不做h f g相当于h x g f x 反而
  • 如何使用 Haskell 提交 html 表单

    我知道如何使用http 管道 http hackage haskell org package http conduit 2 1 0包的 simplehttp 从 URL 检索页面 现在如果那样的话怎么办 网页有一个输入文本字段和一个提交按

随机推荐

  • 如何传递对字符串的引用?

    我读过的所有内容scanf gets and fgets是它们有问题 带有空白 溢出或复杂性 我正在学习 C 课程简介 因为我有足够的 Java 和其他语言编程经验 所以我有信心这样做 所以我决定创建自己的函数来获取用户使用的字符串输入ge
  • 涉及 group by 和 join 的 SQL 查询

    我无法在标题部分更具体 但我想为我做一些有点复杂的事情 我以为我做到了 但事实证明这是有问题的 我有以下三个表 项目表 id项目 title idOwner 报价表 idOffer id项目 帐号 负责任的 帐号 Username Now
  • 我可以阻止接口的实现吗?

    我有以下情况 public interface A void doSomethingCool public interface B extends A void doSomethingVeryBCool public interface C
  • 等待用户完成 JavaScript 中 blob 的下载

    在 Javascript 中 我创建了许多 blob 我想提示用户将它们另存为文件 目前 我正在使用URL createObjectURL 将 URL 放入链接中 并模拟对该链接的点击 当然我打电话URL revokeObjectURL释放
  • 从 DWORD 到 64 位指针的类型转换警告

    旧的 32 位 C 应用程序 MS Visual Studio 的代码行如下 m value PUCHAR someDWORD 其中 PUCHAR 是指向无符号字符的指针 现在我已更改为 64 位 并且收到有关从 DWORD 转换为 64
  • RequireJS:为什么相对路径适用于define(),但不适用于require()?

    假设您有以下目录结构和以下文件 root require jquery js folder index html main js AnotherModule js 在 RequireJS 中 当您引用以 开头的模块时 RequireJS 会
  • 是否可以使用 PowerShell 获取 Azure 订阅优惠或 OfferId?

    是否可以使用 Powershell 获取 Azure 订阅优惠或 OfferId 通过门户 这将是订阅 gt 属性 gt 优惠或优惠 ID 我找了好久了 还是没看到 Thanks 现在可以使用资源图形浏览器通过类似于以下的查询从门户完成此操
  • 如何读取本地xml文件作为android中的输入流资源文件夹?

    我正在尝试从类似的东西获取输入流 InputSource myInputSource new InputSource activity getResources openRawResource com MYCLass R xml progr
  • 在邮递员帖子请求中发送地图

    当我希望它使用 RequestBody 注释直接映射到我的 Java pojo 时 我找不到关于如何在 json 帖子中格式化地图的好答案 我假设 json 看起来像这样 myInt 10 myMap 1 A 我的 pojo 会有一个myI
  • JS 代码在 codepen 上运行缓慢,但在本地运行良好

    我已经为无与伦比的井字游戏实现了极小极大算法 极小极大算法是递归的 执行大迭代 这对计算机来说并不大 只对人类来说大 第一步在 codepen 上执行大约需要 3 秒 但在我的本地计算机上立即执行 怎么了 我的代码效率不高吗 或者是code
  • Google Charts LineChart 自定义点

    是否可以添加一个自定义点形状到折线图 谷歌的自定义点文档没有提及任何有关添加他们尚未提供的形状的内容 我确实找到了这个类似的问题有一个很好的答案 但我不认为我可以使用 angular google chart 做到这一点 即使有可能 我也希
  • Javascript 对象 push() 函数

    我有一个 javascript 对象 我实际上通过 ajax 请求获取数据 var data 我在里面添加了一些东西 data 0 ID 1 Status Valid data 1 ID 2 Status Invalid 现在我想删除所有状
  • 将 Excel 转换为 PDF - Java 使用 iText

    我使用 Apache POI 创建了一个 excel 文件 现在我需要将其转换为 PDF 我想使用 iText 但我想将合并的单元格 样式等从 Excel 文件复制到 pdf 我怎样才能实现这个目标 因为我在网上找到的代码示例 使用 iTe
  • ruby、rails gem 安装错误 - 错误:执行 gem 时 ... (Encoding::UndefinedConversionError)

    我尝试使用 ruby 来使用上一个版本 但是当运行 gem install Rails 时 总是出现错误 ERROR While executing gem Encoding UndefinedConversionError U 041D
  • 检查 SQL Azure 中数据库是否存在

    谁能告诉我如何在 sql azure 中编码数据库是否存在 您是否尝试过查询 sys databases 表 这应该会给你你正在寻找的东西 更多信息here 注意 您需要针对 Master 数据库运行此查询 否则 您只会看到当前数据库 和主
  • 如何使用 Loki 的小对象分配器?

    我需要使用 Loki 的小对象分配器 但我对其工作原理感到非常困惑 我已经阅读了文档和很多论坛 但没有意义 其中一些人说使用 stl 其他人则使用自定义分配器 我只需要能够通过分配和取消分配不同大小的对象来测试其性能 有人可以提供一个如何使
  • java方法重载继承与多态

    这是我遇到的一个测试练习问题 非常感谢您帮助我理解这些概念 让 Hawk 成为 Bird 的子类 假设某个类有两个重载方法 void foo Hawk h 和 void foo Bird b 在调用 foo x 之后将执行哪个版本 声明 B
  • 为 GM 创建 JQueryscript - 重写 JS 代码带来的麻烦

    在尝试在没有帮助和有帮助的情况下解决问题之后 我仍然陷入困境 我的目标是用 JS 编写一个 GM 脚本 有人告诉我使用 jQuery 因为它很简单 嗯 我上周开始学习 JS 脑子里塞满了信息 我需要的是提示 开始 开始 任何告诉我如何将脚本
  • 如何选择具有指定条件的不同行

    假设有一张表 a 1 a 2 b 2 c 3 c 4 c 1 d 2 e 5 e 6 如何选择每组所有行的不同最小值 所以这里的预期结果是 a 1 b 2 c 1 d 2 e 5 EDIT 我的实际表包含更多列 我想全部选择它们 这些行仅在
  • 在 Haskell 中提升高阶函数

    我正在尝试构造一个类型的函数 liftSumthing a gt m b gt m b gt a gt t m b gt t m b where t是一个 Monad 转换器 具体来说 我有兴趣这样做 liftSumthingIO Mona