为什么 MFunctor 的“hoist”没有“Monad n”约束?

2024-01-26

我有一个协程变压器

data Step y m a = Done a | Yield y (CoT y m a)

data CoT y m a = CoT (m (Step y m a))

with Monad实例

unCoT :: CoT y m a -> m (Step y m a)
unCoT (CoT m) = m

instance Monad m => Monad (CoT y m) where
    return  = CoT . return . Done
    CoT x >>= f = CoT $ do
      x' <- x
      case x' of
        Done a -> unCoT (f a)
        Yield y x' -> return (Yield y (x' >>= f))

如果我定义一个MFunctor与 一起上课Monad m and Monad n我可以定义的约束hoist

class MFunctor t where
  hoist :: (Monad n, Monad m) => (forall a. m a -> n a) -> t m b -> t n b

instance MFunctor (CoT y) where
  hoist f (CoT m) = CoT $ do
    step <- f m
    return (case step of Done x     -> Done x
                         Yield y m' -> Yield y (hoist f m'))

But mmorph's hoist只有一个Monad m约束。我可以定义我的hoist没有它,或者这是缺乏通用性MFunctor?

编辑:我解决了is可能的!但我的问题仍然存在:我们确定这里不缺乏普遍性吗?

instance MFunctor (CoT y) where
  hoist f (CoT m) = CoT $ f $ do
    step <- m
    return (case step of Done x     -> Done x
                         Yield y m' -> Yield y (hoist f m'))

mmorph是在以下背景下开发的pipes-3.*系列(以前是一个内部的pipes module http://hackage.haskell.org/package/pipes-3.1.0/docs/Control-MFunctor.html),其功能如下:

raise
    :: (Monad m, MFunctor t1, MonadTrans t2)
    => t1 m r -> t1 (t2 m) r
raise = hoist lift

如果您添加Monad n约束到hoist那么你必须添加一个Monad (t2 m)约束到raise。我通常会尝试尽量减少图书馆中的限制,但我找不到任何限制MFunctor需要的实例Monad n约束,所以我把它删除了。

边注:CoT y m a是一样的Producer y m a from pipes,其中已经有一个MFunctor实例。

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

为什么 MFunctor 的“hoist”没有“Monad n”约束? 的相关文章

  • 一个目录中的多个 Haskell cabal-packages

    在一个目录中包含多个 cabal 软件包的推荐方法是什么 Why 我有一个包含许多可分离模块的旧项目 由于最初它们只形成一个程序 因此将它们放在同一目录中以便于编译非常方便 而且现在仍然如此 Options 只是忍受并将所有内容 包括保存内
  • 运行程序的最佳 Haskell 库是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 如果我要将一个程序投入生产 我需要该程序做几件事才能将其视为 可操作 也就是说 工程师和操作人员以可测量
  • Haskell - 交替两个列表中的元素

    我正在尝试编写一个 haskell 函数 它接受两个整数列表并生成一个列表 其中包含从两个列表中交替获取的元素 我有这个功能 blend xs ys 一个例子 blend 1 2 3 4 5 6 应该返回 1 4 2 5 3 6 我的逻辑是
  • 如何使用 alex/haskell 执行 python 风格的缩进/缩进标记?

    我正在用 Haskell 为 Alex 中的一种小语言编写一个词法分析器 该语言被指定为具有 python 式的显着缩进 只要缩进级别发生变化 就会发出 INDENT 标记或 DEDENT 标记 在像 C 这样的传统命令式语言中 您将在词法
  • 模式匹配中的 Monoid mempty

    我尝试写一个通用的maximum功能类似于Prelude 我的第一个天真的方法如下所示 maximum F Foldable a Ord b gt a b gt Maybe b maximum mempty Nothing maximum
  • 测试列表是否已排序

    在 haskell 中找到最小列表确实很容易 foldl1 min 9 5 7 3 7 4 6 10 给我3 我更换了min with lt 测试列表是否已排序 foldl1 lt 9 5 7 3 7 4 6 10 我收到此错误消息 No
  • 我是否应该使用 GHC Haskell 扩展?

    当我学习 Haskell 时 我发现有很多语言扩展 http haskell org ghc docs latest html users guide ghc language features html在现实生活中使用的代码 作为初学者
  • 当单态限制打开*时,如何解决歧义问题?

    因此 在学习 Haskell 时 我很快就遇到了可怕的单态限制 在 ghci 中 Prelude gt let f print show Prelude gt f 5
  • 在 Haskell 中,如何将嵌套上下文中的函数“应用”到上下文中的值?

    nestedApply Applicative f Applicative g gt g f a gt b gt f a gt g f b 正如类型所示 如何获得 a gt b 应用于那个a在上下文中f 感谢帮助 这是关注类型很有帮助的情况
  • 我们不应该使用单子绑定来使用循环写下 mfix 的情况

    我一直在尝试写mfix向下使用Control Arrow loop https hackage haskell org package base 4 14 0 0 docs src Control Arrow html loop 我想出了不
  • 使用 Haskell 的欧拉项目 #1

    import Data Set euler Int euler sum x x lt nums where nums Data Set toList Data Set union Data Set fromList 3 6 999 Data
  • 算法 - 如何有效删除列表中的重复元素?

    有一个list L 它包含以下元素任意类型each 如何有效删除此类列表中的所有重复元素 必须保留订单 只需要一个算法 因此不允许导入任何外部库 相关问题 在Python中 从列表中删除重复项以使所有元素都是唯一的最快算法是什么在维持秩序的
  • 可以通过Data.Function.fix来表达变形吗?

    我有这个可爱的fixana这里的函数执行速度比她的姐妹快 5 倍左右ana 我有一个criterion报告支持我这一点 ana alg Fix fmap ana alg alg fixana alg fix f gt Fix fmap f
  • 如何在 TH 拼接中复制 'name 的行为

    考虑这个 Haskell 文件 LANGUAGE TemplateHaskell OPTIONS GHC fplugin Test Inspection Plugin module Text main where import Test I
  • 计算两点之间的距离(Haskell)

    给定两个元组的输入 我希望能够使用以下公式计算两点之间的距离 距离 sqrt x1 x2 2 y1 y2 2 所以我希望函数调用和输出如下所示 gt distance 5 10 3 5 5 385 当我尝试运行下面的代码时 它告诉我输入 w
  • 我应该使用镜头中的什么来按索引构建只读吸气剂?

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

    过滤器类函数接受一个条件 a gt Bool 并在过滤时应用它 当您有多个条件时 使用过滤器的最佳方法是什么 使用了应用函数 liftA2 而不是 liftM2 因为出于某种原因我不明白 liftM2 在纯代码中如何工作 liftM2 组合
  • 存在函数依赖关系时类型推断如何工作

    考虑下面的代码 LANGUAGE MultiParamTypeClasses FlexibleInstances FunctionalDependencies UndecidableInstances FlexibleContexts cl
  • 为什么 exceptT 没有 MonadMask 实例?

    爱德华 克梅特例外情况图书馆不提供单子掩码 https www stackage org haddock lts 7 18 exceptions 0 8 3 Control Monad Catch html t MonadMask实例为Ex
  • Haskell 中的类型化抽象语法和 DSL 设计

    我正在 Haskell 中设计 DSL 我想要进行赋值操作 像这样的东西 下面的代码只是为了在有限的上下文中解释我的问题 我没有类型检查 Stmt 类型 data Stmt forall a Assign String Exp a Assi

随机推荐

  • 即使没有引用,表中的字段数量也会影响性能吗?

    我正在读取 CSV 文件并将其解析到 SQL Server 2008 数据库中 此过程对所有文件使用通用 CSV 解析器 CSV 解析器将解析的字段放入通用字段导入表 F001 VARCHAR MAX NULL F002 VARCHAR M
  • numpy.sort() 错误 ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()

    当我使用numpy对数组进行排序 出现这个问题 Traceback most recent call last File D Desktop LIP complier num f t py line 75 in
  • 使用擦除和插入替换向量中的元素

    void replace vector
  • 在 swift 上重写 NSObject 中的描述方法

    当我尝试在 xcode 项目中构建一个对象时 出现一个编译器错误 这是代码 import UIKit class Rectangulo NSObject var ladoA Int var ladoB Int var area Int ge
  • android中httppost和httpget方法的区别? [复制]

    这个问题在这里已经有答案了 谁能告诉我两者之间的区别Httpost and Httpget method Httpclient可以执行POST和GET方法 请解释一下方法1和方法2的区别 1 httpclient execute httpp
  • 如何在 Symfony 2 中为数据库视图设置实体(学说)

    假设我有一个视图表 我想将数据从它获取到一个实体 我可以 以及如何 创建实体类来执行此操作 不需要保存操作 我只是想展示它们 接受的答案是正确的 但我想提供一些您可能需要考虑的其他建议 将您的实体标记为只读 将构造函数设为私有 以便只有 D
  • 如何让Android Webview背景透明在KITKAT(4.4)

    最近 我在Android上实现了基于Web的应用程序 我想让webview背景颜色透明的 搜索后 我发现 Webview 有两行 newWebView setBackgroundColor 0x00000000 newWebView set
  • 无法与 PayPal 服务器通信

    Update hideCreditCardButton在这个问题上没有任何作用 这只是一个巧合 当我在没有信用卡的情况下尝试它时 它对我有用 但情况不再是这样了 我确实工作 但只有 20 30 的时间 我正在使用 PayPal iOS SD
  • wait Task.Delay() 延迟的时间比预期的要长

    我有一个大量使用 Net 任务的 Windows 服务应用程序 我对它们有很好的了解 但我不是专业人士 并且遇到了问题 我有一种情况 我的await Task Delay 有时需要比应有的时间长得多 最多长 60 秒 我确信这是由于我正在做
  • 如何在非 GUI 应用程序中使用 QWebPage

    我想用QWebPage在非 GUI Qt 应用程序中 我的意思是我根本不想与窗口服务器通信 不过 使用 QtGui 不是问题 QWebPage内部创建一些QWidget实例 因此 使用QCoreApplication不可能 当创建一个QAp
  • 包含多个 Chart.js 图表的 pdf 页面

    我使用 Chart js 生成一个包含多个图表的报告页面 我需要将此报告导出为 PDF 通过搜索可以找到许多解决方案 但我找不到具有多个画布元素的解决方案 唯一可用的解决方案似乎是循环遍历所有图像 并使用图像重新创建报告 然后将其下载为 p
  • onKey onKeyDown 不起作用

    我正在尝试在我的 Android 应用程序中注册方向键 电视遥控器方向键点击 我目前正在使用 Android 模拟器进行测试 并尝试在额外设置菜单下使用方向键输入进行单击 但我不确定为什么这不起作用 任何帮助将不胜感激 public cla
  • 如何使用 Java 复制文件并将其粘贴到剪贴板?

    如何使用 Java 复制文件并将其粘贴到剪贴板 我的程序可以复制但不能粘贴 它给 线程 main 中的异常 java lang ClassCastException java util Arrays ArrayList 无法转换为 java
  • Plotly.js - gd.data 必须是一个数组

    我正在使用 Plotly js 库来绘制 3D 图形 我的计划是将 4 条迹线绘制到一张 3D 图中 但是当我尝试这样做时 我的网站遇到了一些奇怪的行为 有时 当我加载网站时 我没有收到任何错误 并且所有 4 条轨迹都完美加载到我的 3D
  • 将 GWT 应用程序部署为单个 JavaScript 文件

    GWT 应用程序的已编译 JavaScript 输出分为不同的文件 例如 缓存 html gwt rpc 托管 html nocache js 我知道这样做的目的是最小化必须由用户下载的 JavaScript 的大小 例如 Firefox
  • 更新表插入 VARBINARY 数据

    当我运行 sql 查询时 我得到如下信息 不允许从数据类型 varchar 到数据类型的隐式转换 varbinary 使用 CONVERT 函数运行此查询 严重程度 16 我想要插入的数据看起来像 000012000000000000100
  • 如何使用 Windows 任务计划程序自动执行 PowerShell 脚本?

    我有一个发送电子邮件的 PowerShell 脚本 我想每 1 分钟自动执行一次该脚本 我该如何使用任务计划程序来做到这一点 目前我已经创建了一个任务并提供了脚本的路径 但是该调度程序打开我的脚本 而不是执行 我使用的是 Windows 7
  • JDK8 是 JBoss 6 AS 支持的平台吗

    我们正在将应用程序 java 平台升级到最新的稳定平台 并且我们正在使用 Jboss 6 AS Is 甲骨文JDK8JBoss 6 AS 支持的平台 不 它不会起作用 JBoss AS 6和 7 不兼容Oracle JDK 1 8 您需要下
  • 阻止 GSON 序列化 JSON 字符串

    我是 gson 的新手 并且有一个尚未找到答案的新手问题 所以请耐心等待 StackOverflow 和 google 不是我的朋友 我有一个 java 类 User 其属性之一 externalProfile 是一个包含已序列化 JSON
  • 为什么 MFunctor 的“hoist”没有“Monad n”约束?

    我有一个协程变压器 data Step y m a Done a Yield y CoT y m a data CoT y m a CoT m Step y m a with Monad实例 unCoT CoT y m a gt m Ste