“MonadIO m”和“MonadBaseControl IO m”之间有什么区别吗?

2023-12-31

功能运行TCP客户端 http://hackage.haskell.org/package/network-conduit-1.0.0/docs/Data-Conduit-Network.html#v:runTCPClient from 网络管道有以下签名:

runTCPClient :: (MonadIO m, MonadBaseControl IO m)
             => ClientSettings m -> Application m -> m ()

MonadIO m提供

liftIO :: IO a -> m a

and MonadBaseControl IO m提供

liftBase :: IO a -> m a

没有明显的差异。它们提供相同的功能吗?如果是,为什么类型签名重复?如果不是,有什么区别?


liftBase是其一部分MonadBase http://hackage.haskell.org/package/transformers-base-0.4.1/docs/Control-Monad-Base.html#t:MonadBase这是一个概括MonadIO对于任何基本单子,正如你所说,MonadBase IO提供与以下相同的功能MonadIO.

然而,MonadBaseControl http://hackage.haskell.org/package/monad-control-0.3.2.2/docs/Control-Monad-Trans-Control.html#t:MonadBaseControl是有点复杂的野兽。在MonadBaseControl IO m你有

liftBaseWith :: ((forall a. m a -> IO (StM m a)) -> IO a) -> m a
restoreM     :: StM m a -> m a

通过查看示例最容易了解实际用途。例如,bracket http://hackage.haskell.org/package/base-4.6.0.1/docs/Control-Exception-Base.html#v:bracket from base有签名

bracket ::  IO a -> (a -> IO b) -> (a -> IO c) -> IO c

只要MonadBase IO m (or MonadIO m)你可以举起主要bracket调用到m但包围动作仍然需要是普通的旧式IO.

throw and catch也许是更好的例子:

throw :: Exception e => e -> a
catch :: Exception e => IO a -> (e -> IO a) -> IO a

您可以轻松地从任何MonadIO m你可以捕获异常IO a inside MonadIO m但同样,两个动作都在运行catch并且异常处理程序本身需要IO a not m a.

Now MonadBaseControl IO使得可以写bracket and catch以允许参数操作也是类型的方式m a而不是仅限于基本单子。上述函数(以及许多其他函数)的通用实现可以在包中找到lifted-base http://hackage.haskell.org/package/lifted-base。例如:

catch   :: (MonadBaseControl IO m, Exception e) => m a -> (e -> m a) -> m a
bracket :: MonadBaseControl IO m => m a -> (a -> m b) -> (a -> m c) -> m c

EDIT:现在我实际上正确地重新阅读了你的问题......

不,我不明白为什么签名需要两者MonadIO m and MonadBaseControl IO m since MonadBaseControl IO m应该暗示MonadBase IO m这可以实现完全相同的功能。所以也许这只是一些旧版本的遗留物。

看看源码,可能只是因为runTCPClient calls sourceSocket and sinkSocket内部和那些需要MonadIO。我猜测包中的所有函数不简单地使用的原因MonadBase IO就是它MonadIO人们更熟悉,大多数 monad 转换器都有一个定义为的实例MonadIO m => MonadIO (SomeT m)但用户可能必须编写自己的实例MonadBase IO.

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

“MonadIO m”和“MonadBaseControl IO m”之间有什么区别吗? 的相关文章

  • 使用 cabal new-install 重新安装相同版本的软件包

    我正在开发 Haskell 包 我还没有上传到Hackage 版本号是0 1 0 0 我正在使用新风格的 Cabal 命令 为了在我处理包的同时测试它 使库可用于测试项目 我运行cabal new install lib构建包后 然而 我注
  • 函数式编程是否需要新的命名约定?

    我最近开始使用 Haskell 学习函数式编程 并在 Haskell 官方 wiki 上发现了这篇文章 如何阅读哈斯克尔 http www haskell org haskellwiki How to read Haskell What t
  • 类 GADT 类型变量的未来角色?

    A 昨天的问题 https stackoverflow com q 41135212 3072788有一个定义HList 来自HList https hackage haskell org package HList 0 4 1 0 doc
  • 将系统命令的结果绑定到 Haskell 中的变量

    如何在 Haskell 中运行系统命令and将其结果 即标准输出 绑定到变量 在伪 Haskell 中 我正在寻找类似以下内容的内容 import System Process main do output lt callCommand e
  • 为什么 Haskell 中有协函子和逆变函子的区别,而范畴论却没有区别?

    这个答案是从范畴论的角度来看的 https math stackexchange com a 661989 72174包括以下语句 事实是 协函子和逆变函子之间没有真正的区别 因为每个函子只是一个协变函子 More in details a
  • 在 Haskell 中计算移动平均线

    我正在学习 Haskell 所以我尝试实现移动平均函数 这是我的代码 mAverage Int gt Int gt Float mAverage x a fromIntegral k fromIntegral x k lt rawAvera
  • Haskell 类型系统的细微差别

    我一直在深入了解 haskell 类型系统的本质 并试图了解类型类的要点 我已经学到了很多东西 但我在下面的代码片段上遇到了困难 使用这些类和实例定义 class Show a gt C a where f Int gt a instanc
  • 如何手动推断表达式的类型

    给定 Haskell 函数 head filter fst 现在的问题是如何手动 手动 找到类型 如果我让 Haskell 告诉我我得到的类型 head filter fst Bool b gt Bool b 但我想了解仅使用所用函数的签名
  • Haskell 中的 print 是纯函数吗?

    Is print在 Haskell 中是纯函数 为什么或者为什么不 我认为不是 因为它并不总是返回与纯函数应返回的值相同的值 类型的值IO Int并不是真正的Int 它更像是一张纸 上面写着 嘿 Haskell 运行时 请生成一个Int如此
  • 如何在 Haskell 中向右或向左移动列表的 1 个元素?

    嗨 我一直在寻找答案 但找不到 假设我们有一个像这样的列表 1 10 4 5 3 我怎样才能将 5 向左移动 使这个列表变成 1 10 5 4 3 我尝试过了swapElementsAt通过找到该元素的索引 但它看起来非常不足 swapEl
  • 在依赖类型的函数式编程语言中,扁平化列表是否更容易?

    在 haskell 中寻找一个可以展平任意深度嵌套列表的函数时 即应用的函数concat递归并在最后一次迭代时停止 使用非嵌套列表 我注意到这需要有一个更灵活的类型系统 因为随着列表深度的变化 输入类型也会变化 确实 有几个 stackov
  • 将 num 的签名键入 double?

    我才刚刚开始为你学习 Haskell 以获得伟大的好处 并且我在类型类方面遇到了一些麻烦 我想创建一个接受任何数字类型并强制其为双精度的函数 我的第一个想法是定义 numToDouble Num gt Double 但我认为这不起作用 因为
  • 以下两个 lambda 函数的空间复杂度

    我正在阅读以下内容 https en wikibooks org wiki Haskell Graph reduction https en wikibooks org wiki Haskell Graph reduction 其内容如下
  • Scala中有类似Java Stream的“peek”操作吗?

    在Java中你可以调用peek x gt println x 在 Stream 上 它将对每个元素执行操作并返回原始流 这与 foreach 不同 foreach 是 Unit Scala 中是否有类似的东西 最好是适用于所有 Monady
  • Haskell 中列表列表的笛卡尔积

    给定一个长度列表的列表x所有子列表的长度都相同y 输出y x长度列表x包含每个子列表中的一项 例子 x 3 y 2 1 2 3 4 5 6 Output 2 3 8不同的输出 1 3 5 1 4 5 1 3 6 1 4 6 2 3 5 2
  • Haskell 中的中缀运算符优先级

    对于以下 Haskell 表达式 返回 a gt gt f 应该读作 返回a gt gt f or 返回 a gt gt f 这里的相关规则是什么 规则始终是函数应用程序的优先级高于任何运算符 因此 return a gt gt f 被解析
  • Haskell:Data.Numbers.Primes 库在哪里?

    我尝试导入 Data Numbers Primes import Data Numbers Primes 伦哈斯克尔给了我 5 hs 1 8 Could not find module Data Numbers Primes Use v t
  • 如何在haskell中获取变量名称

    我来到 haskell 时有一些 c 背景知识 想知道是否有类似的 define print a printf s d n a a int a 5 print a 应该打印 a 5 这是 augustss 提到的 TH 解决方案 LANGU
  • 你能识别 Haskell 程序中的无限列表吗? [复制]

    这个问题在这里已经有答案了 可能的重复 如何判断列表是否是无限的 https stackoverflow com questions 7371730 how to tell if a list is infinite 在Haskell中 你
  • Haskell:IORef 的性能

    我一直在尝试在 Haskell 中编码一个需要使用大量可变引用的算法 但与纯粹的惰性代码相比 它 也许并不奇怪 非常慢 考虑一个非常简单的例子 module Main where import Data IORef import Contr

随机推荐

  • 使用 JSON 序列化(和反序列化)“复杂”Rails 对象

    可能是一个愚蠢的问题 但我对 Rails 比较陌生 并且想知道 Rails 如何处理序列化具有多个 和 或属于 另一个类的对象的模型 它会默认序列化整个对象图吗 你一定想要那个吗 你能控制吗 如何 接收端关于如何反序列化它有什么技巧吗 或者
  • 想学习Windows编程,有什么建议吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • C 编译器如何发现 -lm 指向文件 libm.a?

    Linux 中 C 编程中的 a 文件是什么 是库文件吗 To merge with the math library libm a you would type cc o program name prog c lm when you c
  • 双端链表和双向链表的区别

    我不明白双端列表和双链表之间的区别 两者之间的主要区别是什么 在双向链表中 每个节点都有两个指针 一个朝向其下一个节点 另一个朝向其前一个节点 在双端链表中 每个节点只有一个指向其下一个节点的指针 它与单端链表的区别在于 它不是只有一个 头
  • CSS“真实”阴影(光源)

    看看下面的图片 蓝色的盒子是div 现在我想做的是实现一种 2 5D 功能 我希望灰色阴影有点 3D 风格 起初我想将 Y 轴分配给盒子阴影值 如下所示 box shadow 5px 5px 10px value tallness 888
  • USB 详细信息 - 到目前为止还没有运气

    我长期以来一直在寻找有关 USB 协议和布线如何工作的详细说明 但没有成功 我正在寻找关于 USB 软件和硬件方面的工作原理的详细但不过分复杂的解释 链接和解释将不胜感激 我真的没有什么想法了 所以如果你能帮助我那就太好了 这是我所知道的
  • 如何使用 Properties.Resources 中的图像从 WPF 中的代码隐藏动态更改图像源?

    我有一个 WPF 应用程序 需要向用户提供有关内部状态的反馈 该设计有三个图像 分别称为红色 黄色和绿色 根据状态 一次将显示其中一张图像 以下是要点 这三个图像位于代码隐藏的 Properties Resources 中 一次仅显示一张图
  • Xlib:关闭窗口总是导致致命的 IO 错误?

    我不确定为什么会发生这种情况 但是当我尝试使用 X 按钮关闭时 我使用 C 中的 Xlib 创建的任何窗口都会向终端输出错误 我可以通过编程方式关闭它 不会出现错误 只需按 X 按钮即可 错误如下 XIO fatal IO error 11
  • Enter 键在 ASP.NET 多行文本框控件中插入换行符

    我继承了一些 C asp net 代码 其中有一个文本框 我想将其设置为多行 我通过添加 textmode multiline 来做到这一点 但是当我尝试插入换行符时 回车键会提交表单 P 我用谷歌搜索了一下 似乎默认行为应该是输入 或控制
  • 在组件测试规范中模拟BehaviorSubject

    我正在尝试模拟组件测试中的服务依赖项 该服务有一个我正在尝试模拟的行为主题属性 我的服务如下 export class DatePickerService public date moment Moment public selectedD
  • Elm:将包含单个元素的 JSON 数组解码为字符串

    看过类似的东西 但找不到确切的问题 我有一个从服务器端验证返回的 JSON 如下所示 field field name messages message message 我想做的是将其解码为 elm 记录 例如 field String m
  • 从两个枚举类创建复合类型,为 STL 映射做好准备

    我想创建一个由两种类型组成的复合类型enum classes enum class Color RED GREEN BLUE enum class Shape SQUARE CIRCLE TRIANGLE class Object Colo
  • requirejs 中的把手加载不成功

    paths jquery libs jquery jquery min underscore libs underscore underscore min backbone libs backbone backbone optamd3 mi
  • 编写泛型类来处理内置类型

    也许不太实用 但仍然很有趣 有一些关于矩阵乘法的抽象问题 我快速实现了一个整数矩阵 然后测试了我的假设 在这里我注意到 如果我偶尔想将它与十进制或双精度一起使用 那么仅 int 矩阵不好 当然 我could尝试将所有内容都转换为双倍 但这不
  • pytest配置问题(从nosetests(71秒)到pytest(153​​6秒)的过渡)

    问题 pytest 由策略决定 运行相同的测试套件 585 个测试 需要 1536 秒nosetest 运行时间为 71 秒 The pytest ini文件是 pytest python files tests py tests py n
  • C# 捕获异常

    我应该在 try catch 中使用哪个异常来找出用户何时以错误的格式输入了数据 Example try string s textBox1 Text User inputs an int Input error MessageBox Sh
  • 如何获取wiki模板的内容?

    有谁知道如何访问页面内的模板主体 我熟悉返回所有现有模板列表的 API 但是我如何才能访问模板的主体呢 有这方面的API吗 目前我只看到一种可能的方法 手动解析它 我错了吗 您可以使用扩展模板 http www mediawiki org
  • Flask-restx 请求解析器返回 400 Bad Request

    我在用着flask restx在我的 Flask 应用程序中 但每次我使用 swagger ui 发出请求时 它都会返回 400 http 127 0 0 1 5000 api user register password test ema
  • 如何打印方法的返回值

    我正在研究一种随机数方法来从数组中选择随机元素 但是 我不知道如何打印返回值getRandom 方法 这是代码 import java util Random public class CardDeck public static void
  • “MonadIO m”和“MonadBaseControl IO m”之间有什么区别吗?

    功能运行TCP客户端 http hackage haskell org package network conduit 1 0 0 docs Data Conduit Network html v runTCPClient from 网络管