为 newtype 创建 MonadBaseControl 实例

2024-01-12

假设我有简单的新类型声明

newtype Foo a = Foo { unFoo :: ReaderT Int IO a }

我想创建 MonadBaseControl IO 的 Foo 实例。这应该很容易,因为 ReaderT Int IO 已经是 MonadBaseControl IO 的实例。但是,使用 GeneralizedNewtypeDeriving 自动派生它不起作用,因为 MonadBaseControl 类具有关联的类型。

如何为 Foo 编写 MonadBaseControl IO 实例? defaultLiftBaseWith 和 defaultRestoreM 应该会有帮助,但破译它们的类型有点困难。


Foo既不是“基础”单子,也不是单子转换器。defaultLiftBaseWith在这里没有帮助,因为你想要实例Foo与 相同ReaderT Int IO.

首先,使用 GND 获取无聊实例:

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

import Control.Monad.Trans.Control
import Control.Monad.Base 
import Control.Monad.Reader 
import Control.Applicative

newtype Foo a = Foo { unFoo :: ReaderT Int IO a } 
  deriving (Monad, Applicative, Functor, MonadBase IO)

实例为MonadBaseControl IO只是删除新类型,使用来自ReaderT实例,并将结果放回新类型中:

instance MonadBaseControl IO Foo where
  type StM Foo a = a 
  liftBaseWith f = Foo $ liftBaseWith $ \q -> f (q . unFoo)
  restoreM = Foo . restoreM 

请注意,如果StM wasn't关联类型系列,你可以做类似的事情

newtype Foo a = Foo { unFoo :: ReaderT Int IO a } 
  deriving (Monad, Applicative, Functor, MonadBase IO, MonadBaseControl IO)

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

为 newtype 创建 MonadBaseControl 实例 的相关文章

  • 镜头中的观看和使用有什么区别?

    有什么区别 view MonadReader s m gt Getting a s a gt m a and use MonadState s m gt Getting a s a gt m a in 控制镜头吸气剂 https hacka
  • 在生成此 SOP 函数时,如何修复类型错误,包括“无法对 Traversable 进行量化”?

    我只是说我什至不确定这是否可能 这是迄今为止我在 Haskell 中尝试过的最通用的事情 我正在尝试制作一个更通用的版本applyFunc在发现https stackoverflow com a 58890226 3096687 https
  • Haskell 单例:我们可以通过 SNat 获得什么

    我正在尝试使用 Haskell 单例 在论文中使用单例进行依赖类型编程 http cs brynmawr edu rae papers 2012 singletons paper pdf并在他的博客文章中单例 v0 9 发布 https t
  • 应用交换律

    带有效果的应用程序编程 http staff city ac uk ross papers Applicative html麦克布莱德和帕特森的论文提出了互换法 u lt gt pure x pure f gt f x lt gt u 为了
  • 计算/获取分层数据的“级别”

    好吧 我真的不知道这是否是正确的标题 但我不知道如何称呼它 我的问题是关于我的作业 我现在已经工作了几个小时 主题是 函数式数据结构 我有点陷入困境 我不知道如何继续 所以我需要编写一个具有以下签名的函数 data Heap e t Hea
  • 如何在 blaze-html 中渲染 blaze-svg 标记

    我想将使用 blaze svg 生成的 svg 图直接包含在使用 blaze html 生成的 html 中 两者都基于 blaze markup 所以我希望它很容易 diagram1 Svg diagram1 try1 Html try1
  • Haskell,范围缩小到无步骤[重复]

    这个问题在这里已经有答案了 为什么在 Haskell 中工作范围不能降低到没有步骤 7 1 gt 但只工作这个 7 6 1 gt 7 6 5 4 3 2 1 Haskell 无法知道您想要执行 1 除非您给出提示 在某些情况下 您可能需要一
  • 如何将可选标志解析为 Maybe 值?

    我正在尝试使用optparse 应用程序 https hackage haskell org package optparse applicative 0 11 0 2解析一个Maybe String但我找不到任何地方如何处理Maybe 我
  • 'lens' 的阴谋集团依赖性解析失败

    我刚刚做了一个阴谋更新并尝试从 hackage 安装 lens 这给了我以下错误 cabal install j lens Resolving dependencies Configuring dlist 0 7 0 1
  • 如何获取常量内存中的统计数据

    我有一个函数 它会创建一些随机的数值结果 我知道 结果将是 a 小 a b 约 50 范围内的整数a b 我想创建一个执行上述函数 1000000 次的函数 并计算每个结果出现的频率 该函数使用随机生成器来生成结果 问题是 我不知道如何在常
  • 如何将只缓存某些内容的字段添加到ADT?

    我经常需要向 ADT 添加字段 仅记住一些冗余信息 但我还没有完全弄清楚如何又好又高效地做到这一点 说明问题的最好方法是举个例子 假设我们正在使用无类型 lambda 项 type VSym String data Lambda Var V
  • GHC 是否使用存在类型的动态调度?

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

    我正在编写处理以下值的代码语言 扩展 注释 语法 http hackage haskell org packages archive haskell src exts 1 1 4 doc html Language Haskell Exts
  • 反应性香蕉时间延迟

    我已经查阅了文档反应香蕉 http hackage haskell org package reactive banana 而且我找不到指定明确时间延迟的方法 举例来说 我想采取Event t a并将其所有发生的事件移至未来 1 秒 或获取
  • 带有查询参数的渲染 url

    无法找到简单问题的解决方案 答案应该是显而易见的 如何在 hamlet 模板中使用查询参数渲染 url I e ItemsR 将生成http localhost 3000 items我如何生成类似的东西http localhost 3000
  • 为什么 exceptT 没有 MonadMask 实例?

    爱德华 克梅特例外情况图书馆不提供单子掩码 https www stackage org haddock lts 7 18 exceptions 0 8 3 Control Monad Catch html t MonadMask实例为Ex
  • Parsec 函数“parse”和类“Stream”的类型签名

    约束条件是什么 Stream s Identity t 下面的类型声明是什么意思 parse Stream s Identity t gt Parsec s a gt SourceName gt s gt Either ParseError
  • 为什么以下内容会并行运行而不是顺序运行?

    给定以下函数evalPair parPair and deepSeq分别 evalPair Strategy a gt Strategy b gt Strategy a b evalPair sa sb a b do a lt sa a b
  • 在一元上下文中使用 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 的实例 具

随机推荐

  • 从分页 URL 中删除“页面”

    我在更改 Wordpress 中的分页 URL 时遇到问题 我知道这个问题的通用解决方案是更改 WordPress 核心文件 但我只需要针对一个类别使用此解决方案 也许只有一个类别可以通过 htaccess 来完成 现在有这样的网址 htt
  • 未找到架构 x86_64 的符号 - Cmake - Mac sierra

    最近我开始了一个 C 的新项目 问题是 当我尝试编译它时 出现链接错误 我今天花了一整天的时间尝试调试它 但我并没有真正在任何地方找到好的解决方案 如果有人能帮忙那就太好了 我使用的是 Mac Sierra parsing methylat
  • 如何通过 EF Model First 数据库架构升级避免数据丢失?

    这是一个很长的问题 但如果我能就此得到一些好的建议 我将非常非常感激 简而言之 我正在寻找一种对 MS SQL 数据库模式进行版本升级的好方法 该方法还要求将数据从已删除的表移至新表 我认为 Stack Overflow 是解决这个问题最合
  • 如何在 Emacs 中输入希腊字符

    This http xahlee info emacs emacs emacs n unicode htmlpage 表明希腊字母可以通过使用插入到 Emacs 中M i 然而 Debian Squeeze 变体中的 Emacs 23 2
  • 如何将BottomAppBar + FAB与BottomNavigationView结合起来

    我想使用FloatingActionButton 以及它锚定在 BottomNavigationView 顶部的 BottomAppBar 上时的行为 我想出了一个相当 hacky 的技巧来放置BottomNavigationView在 B
  • 如何证明这个大o符号的说法?

    如何证明这一点 4n O 8n 8n O 4n 那么有哪些C and n0两种情况的值 EDIT 我试图澄清我更多 1 For a proof see formal definition of Big O http en wikipedia
  • 分布式tensorflow在运行server.__init__后独占GPU

    我有两台计算机 每台计算机都有两个 GPU 我试图从分布式张量流开始 但对它是如何工作的感到非常困惑 在计算机 A 上我想要一个ps任务 我的印象是这应该在CPU上进行 和两个worker任务 每个 GPU 一个 我想在计算机 B 上有两个
  • angularjs在控制器之间共享数据配置

    我想知道共享指令的好方法是什么 控制器之间 我有两个指令可以在不同的控制器中使用 我首先想到的是不同的配置 使用类似 html div class container div div div js controller MainCtrl f
  • 如何加载检查点文件并使用略有不同的图形结构继续训练

    当我训练图表时 我发现我忘记在图表中添加 dropout 但我已经训练了很长时间并得到了一些检查点 那么我是否可以加载检查点并添加 dropout 然后继续训练 我的代码现在是这样的 create a graph vgg fcn fcn8
  • Selenium 和 Angularjs 等待执行一些操作

    我正在使用 selenium 来测试 AngularJS 应用程序 我面临的问题是 在页面完全加载之前 我无法在页面上执行任何操作 我可以放置 Thread sleep 但据我所知 这不是一个好的解决方案 有很多方法可以等待页面加载 我用谷
  • Spring @ConditionalOnProperty 注释未按预期工作

    我在属性文件中定义了一个属性 property true 然后我有SomeClass java类 其中should创建属性配置 beanonly如果财产property设置为 true 这是我的SomeClass class public
  • fork() 和输出

    我有一个简单的程序 int main std cout lt lt Hello World fork 程序执行后我的输出是 Hello World Hello World 为什么会发生这种情况而不是单一的Hello world 我猜测子进程
  • Git - 多个用户使用相同的工作目录:.git 元文件中的权限问题

    问题 当多个用户有权访问同一工作目录时 元数据中可能会出现权限问题 如果有 git执行操作 免责声明 在你责备我之前 我意识到共享工作目录与 Git 所代表的含义背道而驰 而且我不是在谈论在此共享目录中执行除只读操作之外的任何操作 我们在自
  • 序列化和封送处理有什么区别?

    我知道就几种分布式技术 例如 RPC 而言 使用了术语 编组 但不明白它与序列化有何不同 它们不是都将对象转换为一系列位吗 Related 什么是序列化 https stackoverflow com questions 633402 wh
  • 为什么 openssl_verify() 无法验证我的 JWT 令牌签名?

    代码 token request gt getQueryParams jwt access token token access token separator list header payload signature explode s
  • Jersey 和 Jackson 子类的序列化不包含额外的属性

    在 Jersey 中 当使用 Jackson 进行 JSON 序列化时 不包括实现子类的额外属性 例如 给定以下类结构 JsonTypeInfo use JsonTypeInfo Id NAME include JsonTypeInfo A
  • Message":"处理请求时出错。","StackTrace":"","ExceptionType" - JQUERY

    这是我的代码 我不断收到相同的错误响应 Message There was an error processing the request StackTrace ExceptionType 我想不通 我正在使用 Eloqua API 来获取
  • 如何连接2个表

    我有 2 张桌子 票证消息消息 ID 整数 创建日期 响应消息res id int 创建日期 我如何合并这两个表 以便它们按创建顺序排列 msg id 已创建resp id已创建 我不认为合并意味着加入 连接意味着您根据某些连接条件将每个表
  • 如何在 SailsJS 应用程序中使用多种布局?

    我的 Sails js 应用程序有单独的frontend and admin布局 我的视图引擎是ejs 如何为前端和管理站点使用单独的布局 我可以为每个操作使用特定的布局吗 From Sails js 文档 http sailsjs org
  • 为 newtype 创建 MonadBaseControl 实例

    假设我有简单的新类型声明 newtype Foo a Foo unFoo ReaderT Int IO a 我想创建 MonadBaseControl IO 的 Foo 实例 这应该很容易 因为 ReaderT Int IO 已经是 Mon