计算期间在环境中隐式携带 STRef

2023-12-24

我正在从事一些更大的计算,需要在某些关键时刻使用可变数据。我想尽可能避免IO。 我的模型曾经由以下组成ExceptT over ReaderT over State数据类型,现在我想替换State与提到的ST.

为了简单起见,我们假设我想保持单身STRefInt在整个计算过程中,让我们跳过ExceptT外层。我最初的想法是把STRef s Int into ReaderT的环境:

{-#LANGUAGE Rank2Types#-}
{-#LANGUAGE ExistentialQuantification#-}

data Env = Env { supply :: forall s. STRef s Int }
data Comp a = forall s. Comp (ReaderT Env (ST s) a)

以及评估者:

runComp (Comp c) = runST $ do
   s <- newSTRef 0
  runReaderT c (Env {supply = s})  -- this is of type `ST s a`

...它失败了,因为

无法将类型“s”与“s1”匹配

这似乎很清楚,因为我混合了两个单独的幻影 ST 状态。但是,我不知道如何绕过它。我尝试过添加幻像s as Comp and Env参数,但结果是相同的,并且代码变得更丑陋(但由于缺少这些而不太可疑)foralls).

我在这里想要实现的功能是supply可以随时访问,但没有显式传递(它不值得)。存储它的最舒适的地方是在环境中,但我看不到初始化它的方法。

我知道有这样的事情STTmonad 转换器这可能会有所帮助,但它与哈希表等更雄心勃勃的数据结构不兼容(或者是吗?),所以只要我不能自由使用经典,我就不想使用它ST那里的图书馆。

如何正确设计这个模型?我所说的“正确”不仅指“类型检查”,还指“对代码的其余部分友好”和“尽可能灵活”。


runST必须给出一个多态参数,并且您希望您的参数来自Comp. Ergo Comp必须包含多态的东西。

newtype Env s = Env { supply :: STRef s Int }
newtype Comp a = Comp (forall s. ReaderT (Env s) (ST s) a)

runComp (Comp c) = runST $ do
    s <- newSTRef 0
    runReaderT c (Env s)

Because Comp结束s,您不能执行返回所包含内容的操作STRef;但您可以公开一个在内部使用引用的操作:

onRef :: (forall s. STRef s Int -> ST s a) -> Comp a
onRef f = Comp $ asks supply >>= lift . f

e.g. onRef readSTRef :: Comp Int and onRef (`modifySTRef` succ) :: Comp ()。另一种可能更符合人体工程学的选择是Comp本身是单态的,但有runComp要求多态动作。所以:

newtype Comp s a = Comp (ReaderT (Env s) (ST s) a)

runComp :: (forall s. Comp s a) -> a
runComp act = runST $ case act of
    Comp c -> do
        s <- newSTRef 0
        runReaderT c (Env s)

然后你可以写

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

计算期间在环境中隐式携带 STRef 的相关文章

  • Haskell:对 Num 类型类的使用感到困惑

    我很困惑为什么这有效 f Num a gt a gt a f x x 42 但这并没有 g Num a gt a gt a g x x 4 2 我本来就明白Num包含实现运算符的所有类型 因此 如果42 is an Int and 4 2
  • Parsec.Expr 具有不同优先级的重复前缀

    Parsec Expr buildExpressionParser 的文档说 相同优先级的前缀和后缀运算符只能出现一次 即 如果 为前缀否定 则不允许使用 2 但是 我想解析这样的字符串 具体来说 考虑以下语法 sentence ident
  • 模块化大型 Grails 应用程序的最佳实践?

    我正在开发的 Grails 应用程序变得相当大 最好将其重构为几个模块 这样我们就不必每次都重新部署整个事情 将 Grails 应用程序拆分为多个模块的最佳实践是什么 特别是 我想创建一个域类 相关服务的包 并将其作为模块在应用程序中使用
  • 组合部分函数

    我有两个偏函数f and g 它们没有副作用并且执行速度快 将它们组合成另一个部分函数的最佳方法是什么h这样h isDefinedAt x iff f isDefinedAt x g isDefinedAt f x 如果h是一个返回一个函数
  • 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 中使 CAF 不是 CAF?

    如何将常量应用形式变成 而不是常量应用形式 以阻止它在程序的生命周期中保留 我尝试过这种方法 Dummy parameter to avoid creating a CAF twoTrues gt Bool twoTrues map Tru
  • 你们中有多少人进行三层设计?

    多年来 三层设计一直是我数据库驱动应用程序的标准设计理念 它从未让我失望过 对于那些练习它的人 描述一下你的层次 我发现很多人混淆了业务层和数据访问层 使其更像是 2 5 层设计 我更喜欢使用存储过程将数据层几乎完全移动到数据库中 并且在代
  • 如何从具有函数依赖关系的类型类中获取和使用依赖类型?

    如何从具有函数依赖关系的类型类中获取和使用依赖类型 为了澄清并给出我最近的尝试的一个例子 从我正在编写的实际代码中最小化 class Identifiable a b a gt b where if you know a you know
  • 与 Functor 不同,Monad 可以改变形状?

    我一直很喜欢以下关于单子相对于函子的力量的直观解释 单子可以改变形状 函子不能 例如 length fmap f 1 2 3 总是等于3 然而 对于单子来说 length 1 2 3 gt gt g往往不等于3 例如 如果g定义为 g Nu
  • 如何使用类型系统编码和强制执行合法的 FSM 状态转换?

    假设我有一个类型Thing拥有国有财产A B C 合法的状态转换是A gt B A gt C C gt A 我可以写 transitionToA Thing gt Maybe Thing 这会返回Nothing if Thing处于无法转换
  • Haskell 为替代的 Either 数据类型定义 Functor 实例

    通过 Typeclassopedia 获得一些使用类型类的路由 想要替代Either的一个实例Functor 但即使检查定义Either作为一个例子Functor总是给我带来麻烦 有这个 但不会编译 data Alt a b Success
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • 来自数据类型的 Haskell 随机数

    我对 Haskell 还很陌生 我有一个数据类型 data Sentence Prop Int No Sentence And Sentence Or Sentence deriving Eq 我已经为它写了一个 Show 实例 然而 无论
  • Scala 功能设计模式目录

    一周以来我一直在阅读 Scala 编程 作者一步一步地介绍了该语言的元素 但我仍然很困惑何时使用演员 闭包 柯里化等功能性的东西 我正在寻找功能结构的典型用例或最佳实践的目录 我并不是说在 Scala 中重新实现像 GoF 这样的众所周知的
  • Cabal:使用源代码构建目录

    我有一个src目录 在这个目录中我有Main hs文件和Test目录 在里面Test我有的目录Test hs模块 我需要用 cabal 来编译它 在我的阴谋集团文件中 我有 Executable main hs or lhs file co
  • Haskell/Idris 中的开放类型级别证明

    在 Idris Haskell 中 可以通过注释类型并使用 GADT 构造函数 例如使用 Vect 来证明数据的属性 但这需要将属性硬编码到类型中 例如 Vect 必须是与 List 不同的类型 是否有可能拥有具有开放属性集的类型 例如同时
  • 领域驱动设计和工厂类的作用

    我不清楚工厂类的角色和职责是什么 我知道工厂类应该负责创建域对象 聚合根 及其关联的实体和值对象 但我不清楚 DDD 架构的工厂 层 在哪里 工厂应该直接调用存储库来获取其数据还是服务库 工厂在以下框架中的位置 UI gt 应用程序 gt
  • 为什么对本地列表求和比用“GHC -O2”对教会编码列表求和慢?

    为了测试教会编码的列表如何针对用户定义的列表和本机列表执行 我准备了 3 个基准测试 用户定义的列表 data List a Cons a List a Nil deriving Show lenumTil n go n Nil where
  • 空对象模式以避免空检查?

    最近 我遇到了空对象设计模式 我的同事说它可以用来消除整个代码中遇到的空指针检查 例如 假设 DAO 类返回有关 Customer 的信息 在名为 CustomerVO 的值对象中 我的主类应该提取名字和电子邮件 ID 并向客户发送电子邮件
  • seq在haskell中代表什么

    我是 Haskell 的新手 刚刚进入惰性世界编程 我读到seq函数非常特殊 因为它强制使用严格的评估 以便在某些情况下更加有效 但我就是找不到什么seq代表字面意思 也许严格评估Q 它应该提醒您 顺序 或 顺序 因为它允许程序员指定其参数

随机推荐

  • 如何在Mono中嵌入flash?

    是否可以在单声道应用程序中嵌入闪存 最好类似于它可以作为 ActiveX 控件嵌入到 Net 中的方式 但是任何 Flash 命令可以以某种方式冒泡到 Mono 应用程序的方式都可以 我原以为可以使用网页浏览器查看flash 但是我无法确定
  • 显示下拉列表时微调器的状态是什么?

    我正在创建一个带有自定义视图的微调器 无论如何 我设法在微调器处于非活动状态以及按下时显示不同的可绘制对象 我希望在下拉列表显示时保持按下状态可绘制 这是 mi XML 文件
  • 虚拟析构函数和未定义的行为

    这个问题不同于 我何时 为何应该使用virtual析构函数 struct B virtual void foo B lt not virtual struct D B virtual void foo D B p new D delete
  • 绝对元素和

    我试图在 Hackerrank 上解决这个问题 https www hackerrank com challenges playing with numbers problem https www hackerrank com challe
  • 有什么办法可以持续运行服务吗?

    Stack Overflow 上很少有类似的问题 但没有一个解决方案适合我 问题在于只有少数设备 例如 OnePlus 和 MI 一旦用户从最近的应用程序中删除应用程序 该服务就会被终止 我读到这些 OEM 使用一些激进的策略来终止服务 我
  • 将 WordPress 网站移至新域后,jQuery 无法正常工作

    我刚刚将我的网站移至 hostgator 上的新域 但现在该网站的内容未显示 无法运行的网站是http alcaldarone com http alcaldarone com我开发和工作的网站是http atcjr alcaldarone
  • Laravel 中的 whereHas 查询

    大家好 filterArray explode filters data articles DB table products gt join product category function q q gt on product cate
  • CSS 列数和 Chrome 错误:如何避免溢出内容被裁剪

    When column count被使用 它似乎裁剪任何overflow内容 columns webkit column count 1 webkit column gap 10px webkit column fill auto moz
  • 在 C++ 中表示浮点无穷大的方法

    我想在我的程序中用 C 表达浮点无穷大 我遇到了两种方法来实现这一目标 使用INFINITY and std numeric limits
  • 如何从 XML 数据中获取特定元素?

    我有一些代码来检索 XML 数据 import cStringIO import pycurl from xml etree import ElementTree API KEY my api key ima the path to a i
  • 不需要的表单参数被附加到分页链接

    我有一个页面 用于通过使用提供的表单提交数据来搜索列表 表单参数通过ajax post请求 提交 在搜索表中创建一条新记录 然后通过以下方式显示列表 动态地 在提交表单的同一页面上 show对此记录的操作 结果有 kaminari 提供的分
  • 在 Java 中将一个文本文件的内容复制到另一个文本文件

    我正在尝试将包含 2 3 个整数 例如 1 2 3 的一个文本文件 1 txt 的内容复制到另一个文本文件 2 txt 但出现以下错误编译后 import java io class FileDemo public static void
  • 为什么这个带有 Expression 的模拟不匹配?

    我是模拟新手 我正在尝试做这个模拟示例 存储库 cs public class Repository IRepository public List
  • 简单的正则表达式——用空格替换下划线

    嘿 我正在编写我的第一个 Rails 应用程序 我正在尝试用空格替换传入 id 名称中的下划线 如下所示 before 测试字符串 after 测试字符串 我怎样才能做到这一点 抱歉 如果这是一个有点愚蠢的问题 我对正则表达式不太熟悉 st
  • 如何查看mysql客户端的字段注释?

    我想看到个别领域的评论 通常是我期望从 描述 参数中得到的东西 mysql gt describe metrics Field Type Null Key Default Extra id int 10 unsigned NO PRI NU
  • BinaryFormatter - 是否可以在没有程序集的情况下反序列化已知类?

    我目前正在尝试与一个程序进行互操作 该程序在首先使用 C 的 BinaryFormatter 格式化数据后通过网络发送数据 这是一个愚蠢的想法 我讨厌它 但我必须与它进行互操作 我知道该类型是什么样子 我知道它的确切布局 但由于各种原因 我
  • 如何向用户表明我的 IIS 网站正在进行维护?

    对于我的 IIS 网站 我想将所有请求重定向到一页 这样做的目的是我想对我所有的 Web 应用程序使用的数据库进行一些维护 使其离线 我在这个网站下运行了大约 50 个网络应用程序 因此我想避免访问每个应用程序来更改某些内容 我想我可以对
  • 如何在故事板中自定义后退按钮

    我创建了一个具有 3 个 ViewController 的应用程序 其名称为 ViewController ViewController2 ViewController3 在 ViewController 中存在一个按钮 用于检查文档文件夹
  • iReport 的 isStretchWithOverflow 问题

    目前我使用该属性isStretchWithOverflow当文本字段中的内容太长时换行 有用 但我想知道如何确定它断线的方式 下面是我的片段jrxml file
  • 计算期间在环境中隐式携带 STRef

    我正在从事一些更大的计算 需要在某些关键时刻使用可变数据 我想尽可能避免IO 我的模型曾经由以下组成ExceptT over ReaderT over State数据类型 现在我想替换State与提到的ST 为了简单起见 我们假设我想保持单