派生 MonadThrow、MonadCatch、MonadBaseControl、MonadUnliftIO 等是否安全?

2023-12-05

我正在重构一些旧代码,这些代码是多态但类型类受限的 monad:

class ( MonadIO m
      , MonadLogger m
      , MonadLoggerIO m
      , MonadThrow m
      , MonadCatch m
      , MonadMask m
      , MonadBaseControl IO m
      , MonadUnliftIO) => HasLogging m where

在旧代码中,应用程序的主要 monad 是......

type AppM = ReaderT Env IO

...现在将更改为...

newtype AppM (features :: [FeatureFlag]) a = AppM (ReaderT Env IO a)
  deriving (Functor, Applicative, Monad, MonadReader Env, MonadIO)

在这种情况下,自动导出以下内容是否安全:

  • 单子投掷
  • 莫纳德捕获
  • 单子掩码
  • MonadBaseControl 类
  • MonadUliftIO

在不深入 GHC 内部的情况下,当编译器自动派生事物时,培养对实际发生情况的直觉的最佳方法是什么?


用户手册包含有关每个扩展的文档,并且它不断变得更好;这是有关推导的部分,这应该足以了解实际发生的情况:https://downloads.haskell.org/~ghc/latest/docs/html/user_guide/glasgow_exts.html#extensions-to-the-deriving-mechanism

在这种情况下,所有这些类都由GeneralizedNewtypeDeriving.

{-# LANGUAGE GeneralizedNewtypeDeriving, UndecidableInstances #-}

module M where

import Control.Monad.IO.Unlift
import Control.Monad.Catch
import Control.Monad.Trans.Control
import Control.Monad.Base
import Control.Monad.Reader

newtype Foo a = Foo (ReaderT () IO a)
  deriving (Functor, Applicative, Monad, MonadIO, MonadUnliftIO, MonadThrow, MonadCatch, MonadMask, MonadBase IO, MonadBaseControl IO)

一般来说,用户定义类的三个相关扩展是GeneralizedNewtypeDeriving, DerivingVia, and DeriveAnyType。而且它也值得启用DerivingStrategies明确正在使用的内容。

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

派生 MonadThrow、MonadCatch、MonadBaseControl、MonadUnliftIO 等是否安全? 的相关文章

  • 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 对于 Web 应用程序来说足够成熟吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 monad 转换器类型类中使用列表 monad?

    我的目标是创建一个在 ReaderT WriterT 堆栈或 RWS 堆栈中使用列表 monad 的函数 更一般地说 如何在 mtl 类型类 例如 MonadReader MonadWriter 中使用列表 monad 我为什么要尝试这样做
  • 在 Haskell 中合并两个列表

    无法弄清楚如何合并两个列表通过以下方式在哈斯克尔 INPUT 1 2 3 4 5 11 12 13 14 OUTPUT 1 11 2 12 3 13 4 14 5 我想提出一个更懒的合并版本 merge ys ys merge x xs y
  • 带有 RankNTypes 扩展的奇怪类型推断

    我正在尝试在 Haskell 中尝试 System F 类型 并通过以下方式实现了自然数的 Church 编码type 当加载这段代码时 OPTIONS GHC Wall LANGUAGE RankNTypes type CNat fora
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • ST monad 是如何工作的?

    我知道 ST monad 有点像 IO 的弟弟 而 IO 又是添加了状态 monadRealWorld魔法 我可以想象状态 也可以想象 RealWorld 以某种方式放入 IO 中 但每次我写一个类型签名ST the sST monad 的
  • 类型级别集结合律的证明

    我试图证明类型级函数Union https hackage haskell org package type level sets 0 8 5 0 docs Data Type Set html t Union是关联的 但我不确定应该如何完
  • 我是否需要采取明确的操作来促进与持久数据结构的共享?

    我来自命令式背景 正在尝试实现一个简单的不相交集 并集查找 数据结构 以获得在 Haskell 中创建和修改 持久 数据结构的一些练习 目标是有一个简单的实现 但我也关心效率 我的问题与此相关 首先 我创建了一个按等级并集的不相交集森林实现
  • Haskell 处理负参数

    尝试对两个值求和 其中只有一个为负值 例如 1 and 2 soma Float gt Float gt Float soma x1 x2 x1 x2 结果出现错误 为什么
  • 通过(单子)join 和 fmap 进行终止检查替换

    我正在使用大小类型 并且有一个用于键入术语的替换函数 如果我直接给出定义 则终止检查 但如果我通过 单子 连接和 fmap 对其进行分解 则不会进行终止检查 OPTIONS sized types module Subst where op
  • 自定义 monad 的 MonadTransControl 实例

    的文档monad control提供有关如何创建实例的示例MonadTransControl using defaultLiftWith and defaultRestoreT 该示例适用于以下情况newtype newtype Count
  • 如何使用foldr为列表创建显示实例?

    我想为我的数据类型 我的列表 编写自己的显示实例 到目前为止 我的方法是有效的 但我总是在末尾有一个逗号 我已经尝试用最后一个元素启动折叠并将其从列表中删除 但它很麻烦而且不起作用 有没有更简单的方法来获得正确的解决方案 实际 1 2 3
  • Haskell 点运算符

    我尝试在 Haskell 中开发一个简单的平均函数 这似乎有效 lst 1 3 x fromIntegral sum lst y fromIntegral length lst z x y 但是为什么下面的版本不行呢 lst 1 3 x f
  • 如何让 do 块提前返回?

    我正在尝试使用 Haskell 抓取网页并将结果编译到一个对象中 如果出于某种原因 我无法从页面获取所有项目 我想停止尝试处理页面并提前返回 例如 scrapePage String gt IO scrapePage url do doc
  • Data.Array 有多快?

    The 文档 http haskell org ghc docs latest html libraries array 0 3 0 3 Data Array html of Data Array reads Haskell 提供了可索引数
  • Haskell 中的所有内容都存储在 thunk 中吗,甚至是简单的值?

    以下值 表达式 函数的 thunk 在 Haskell 堆中是什么样子的 val 5 is val a pointer to a box containing 5 add x y x y result add 2 val main prin
  • Haskell 中多核编程的现状如何?

    Haskell 中多核编程的现状如何 现在有哪些项目 工具和库可用 有哪些经验报道 2009年至2012年期间 发生了以下事件 2012 从 2012 年开始 并行 Haskell 状态更新开始出现在并行 Haskell 摘要 http w
  • 检索 Haskell 项目中所有导入的列表

    因此 我的最终目标是通过确保项目导入的所有实体都存在于其声称可以使用的版本中 来评估 cabal 文件中依赖项的准确性 一个好的开始是找到单个源文件使用的所有导入实体的列表 可选地包含有关它们来自何处的信息 我愿意暂时忽略类实例的情况 因为
  • Haskell数据类型转换问题

    我目前正在学习 Haskell 并且一直在编写一些非常简单的程序来练习 我的程序之一是 import System IO main do putStrLn Give me year y lt getLine let res show cal

随机推荐

  • 在 x 个字符后更改 CSS

    我里面有一个文本字符串td 如下 td This is a long line td 我想要做的是更改前七个字符之后所有字符的字体大小 现在我知道我可以执行以下操作 td This is span class different a lon
  • 在 DataGridView 中显示 SQL 结果的问题

    我试图在我的应用程序的数据网格视图中显示 SQL 查询的结果 下面的代码是我写的 但它似乎与我做什么无关 我无法在表单的 datagridview 中得到任何显示 有人能指出我正确的方向吗 code Sql SELECT FROM jobL
  • awk 中的矩阵加法

    我有一堆变量 如下所示 DURATION 1 57 DURATION 2 07 T0 10 T1 0 TX 0 T0 12 T1 0 TX 1 TC 1 IG 0 TC 2 IG 3 是否可以让 awk 处理这个结果 结果是 DURATIO
  • .NET 对象大小

    net 中堆分配对象的大小是多少 包括管理开销 我假设对象是沿着 4 字节边界分配的 还是使用了不同的方法 x86 上的 4 字节边界 x64 上可能有 8 字节边界 x86 上有 8 个字节的开销 用于类型引用和同步块 如果发现 x64
  • 关于 Express Request,Typescript 声明合并失败

    当我提出明确请求时 我收到此错误 error TS2339 Property test does not exist on type Request
  • Rails 3. 嵌套事务。子块中的异常

    为什么在子块中出现异常后 ActiveRecord 不回滚嵌套事务中的更改 以下是示例 1 gt gt Client transaction do gt Client create name gt Pavel gt gt Client tr
  • Dot net core 1 Tooling Preview 离线安装程序

    是否可以提供离线安装程序DotNetCore 1 0 1 VS2015Tools Preview2 谢谢 Lex Li答案 从以下位置下载在线安装程序here then 在同一文件夹中创建快捷方式 Add the layout开关 带空格
  • 过滤嵌套 JSON javascript

    我正在创建一个采用如下 JSON 的 API hightlights title Fun url fun index html queries music artists events internet title Internet url
  • 自定义元素的名称中是否需要破折号?

    是否可以命名您自己的自定义元素
  • 通过属性使用具有依赖属性的数据类

    例如 我有一堂课Circle 具有依赖属性 radius and circumference 使用a是有意义的dataclass这里是因为样板 init eq repr 和订购方法 lt 我选择一个属性依赖于另一个属性 例如周长是根据半径计
  • REDHAWK UHD 设备使用情况

    我已经成功安装了 UHD 设备以及 REDHAWK 版本 1 8 3 对我来说 如何将波形中的组件连接到设备管理器管理的设备并不明显 我也不清楚 IDL 接口和 USRP 设备上的数据端口之间的相互作用 我无法找到一个使用 USRP 设备发
  • 对 WPF 绑定中的值进行舍入

    我正在尝试实现一个进度条 顶部有一个文本框 也显示进度 然而 该百分比是小数 是否可以通过绑定对数据集中返回的值进行舍入 还是必须通过后面的代码来完成
  • EditText 没有捕获 ViewFlipper 的滑动?

    这太令人抓狂了 我有以下 XML 布局
  • Jaxen 是否仍得到积极支持/开发?

    Jaxen看起来像是一个不错的 可扩展的 XPath 项目 但它似乎没有被积极开发 也没有发布日期 即便是邮件列表网址已死 有人有这方面的信息吗 Jaxen仍在 Github 上积极开发
  • postgresql提取函数源码

    需要使用 SQL 提取 PostgreSQL 函数的源代码 我看到其中一个函数有这种奇怪的行为 所有其他函数 大约 200 都工作得很好 当我运行以下语句时 它有效 select prosrc from pg proc where pron
  • OSX 10.10 为什么 CUDA 7.5 认为我的驱动程序不足?

    我正在尝试在我的 Mac Pro 15 英寸 2009 年中 配备 GPU GeForce 9400M 上安装 CUDA 我已经安装了https developer nvidia com cuda downloads工具包 nvcc ver
  • 如何使用 MATLAB 找到距给定坐标最近的点?

    我需要用 Matlab 解决一个最小化问题 我想知道哪个是最简单的解决方案 我一直在考虑的所有潜在解决方案都需要大量的编程工作 假设我有一个纬度 经度坐标点 A B 我需要的是在纬度 经度坐标地图中搜索距离该点最近的点 特别是 纬度和经度数
  • GPU拾取-精灵周围的不可见像素

    我正在渲染一个包含精灵的拾取场景 当我的光标靠近精灵时 它会注册为一种颜色并被 拾取 当你放大精灵时 这个不可见的边框会变得更大 打开控制台即可查看实时打印的 ID 将光标移近或远离大精灵和小精灵 您将看到精灵在不可见的边框上被选中 这种行
  • 使用bind进行部分应用而不影响接收者

    如果我想部分应用一个函数 我可以使用bind 但似乎我必须影响函数的接收者 第一个参数bind 它是否正确 我想使用执行部分应用程序bind而不影响接收器 myFunction bind iDontWantThis arg1 I dont
  • 派生 MonadThrow、MonadCatch、MonadBaseControl、MonadUnliftIO 等是否安全?

    我正在重构一些旧代码 这些代码是多态但类型类受限的 monad class MonadIO m MonadLogger m MonadLoggerIO m MonadThrow m MonadCatch m MonadMask m Mona