- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一直让我困惑的一件事是现在是否适合使用 IORef。在决定是否对任务使用 IORef 时,是否应遵循任何准则?什么时候是使用 State monad 而不是 IORef 的好时机?
最佳答案
状态及其相关的 ST 都产生可以作为单元运行的“整体”状态计算。他们基本上将可变状态视为产生结果所需的中间数据,但其本身不应引起程序的其余部分的兴趣。
另一方面,放入 IORef 中的内容并不是要运行的“计算”——它只是一个保存简单值的盒子,可以以相当任意的方式在 IO 中使用该值。这个盒子可以放在数据结构中,在程序(的 IO 部分)中传递,在方便的时候替换其内容,由函数关闭等。事实上,变量和变量的很多困惑性质像 C 这样的语言的指针可以使用 IORefs 进行建模,这为任何希望维护自己能够用任何语言编写 C 代码的声誉的专家 C 程序员提供了很大的帮助......这绝对是需要小心使用的东西。
尽管如此,有时在单个代码块中隔离与一段可变状态的所有交互即使不是完全不可能,也是极其笨拙的——某些状态片段必须被传递在这种情况下,盒子方法可能是唯一的选择。 chapter introducing mutable state在 48 小时内为自己编写一个方案教程(顺便说一下,强烈推荐)提供了一个示例。 (请参阅链接,详细讨论为什么使用 IORef(而不是 State 或 ST)在某种 Scheme 解释器设计中对 Scheme 环境进行建模是最合适的。)
简而言之,这些环境需要以任意方式嵌套,并在用户交互实例之间进行维护(在Scheme REPL 中输入的(define x 1)
可能会导致用户稍后能够输入 x
并返回 1 作为值),将对象模型放入Scheme函数中(因为Scheme函数接近它们创建的环境)等。
总而言之,我想说,如果一项任务看起来非常适合它,那么 State 政府将倾向于提供最干净的解决方案。如果需要多个独立的状态部分,也许 ST 可以提供帮助。然而,如果有状态计算难以处理或不可能锁定在自己的代码段中,状态需要在复杂程序的大部分生命周期中以可修改的形式持续存在等,那么 IORef 可能只是适当的事情。
话又说回来,如果需要一种可以通过 IO 代码以受控方式传递和交互的可变状态,为什么不看看 STM 及其 TVar!它们在并发情况下要好得多,事实上,使得解决一些与并发相关的任务实际上很简单。不过,这与问题并不真正相关,所以我会拒绝详细说明。 :-)
关于haskell - 什么时候可以使用 IORef?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1931875/
我正在尝试了解如何 IORefs确实用过,我在遵循我在 https://www.seas.upenn.edu/~cis194/spring15/lectures/12-unsafe.html 上找到的
我注意到 Data.UnionFind使用 IO monad 通过 IORefs 提供指针。我想每个人都高兴地调用unsafePerformIO在纯代码中本地使用它时,因为数据结构很好理解,但是..
一直让我困惑的一件事是现在是否适合使用 IORef。在决定是否对任务使用 IORef 时,是否应遵循任何准则?什么时候是使用 State monad 而不是 IORef 的好时机? 最佳答案 状态及其
我正在开发一个程序,该程序使用大量 IORef 数据类型。哪种方法更能节省内存/处理器效率: [IORef Foo] 或 IORef [Foo] 忽略我使用列表而不是向量或数组的事实。 最佳答案 使用
我一直在尝试在 Haskell 中编码一个需要使用大量可变引用的算法,但与纯粹的惰性代码相比,它(也许并不奇怪)非常慢。 考虑一个非常简单的例子: module Main where import D
想知道如何最好地结合 Control.Lens与 IORef 一起封装。具体来说,我希望能够将 atomicModifyIORef 与镜头一起使用,以便我可以提供 a -> (a, b) 类型的函数并
我制作了以下特定于 IO monad 的函数: memoIO :: MonadIO m => m a -> IO (m a) memoIO action = do ref MRef r m a
我有一个写入 Map 和 PSQ 的主线程。在 Map 和 PSQ 中,我使用相同的键,以便通过查看 PSQ,可以以 O(1) 复杂度找到具有最小优先级的条目,并将其映射到 Map 中的值。 现在,虽
在 Haskell 中,有没有办法测试两个 IORef 是否相同?我正在寻找这样的东西: IORef a -> IORef a -> IO Bool 例如,如果您想可视化由 IORef 组成的图形,这
我找到了一些示例代码,并对其进行了一些更改 counter = unsafePerform $ newIORef 0 newNode _ = unsafePerformIO $
我想知道 是否有合法用途IORef 在 haskell ?更具体地说,如果有人可以解决以下问题或指向适当的地方以了解更多信息,我将不胜感激: 使用 IORef 是否被认为是一种糟糕的 Haskell
有代码读取 IORef 并根据一些条件和计算创建一个新值。现在它将新值写入该 IORef。但它有可能根本没有改变。新值可能与旧值相同。 在写入IORef之前是否检查值是否不同,或者直接写入IORef,
我很难理解 Haskell 中 IORef 类型和 MVar 类型之间的基本区别。有人可以帮我解决这个问题吗?他们似乎解决了同样的问题。 MVar 似乎是针对多线程的,但是 IORef 有 atomi
STRef 和 IORef 之间到底有什么区别,我什么时候使用它们?据我所知,它们都是可变状态,那么它们存在的意义何在? 最佳答案 您可以在 IO 中做更多的事情monad 比 ST单子(monad)
我正在对并发性和内存可见性进行一些实验,并遇到了这种奇怪的行为(请参阅内联评论): module Main where import Data.IORef import Control.Con
在chapter 7非常好的Write yourself a Scheme in 48 hours在解释语言中处理变量的环境(Scheme,其中变量是可变的)被引入为 type Env = IORef
我有一个长期运行的进程,它是 forkIO 'd,它产生像素颜色值: takesAgesToRun :: [[Color]] myForkedProcess :: IORef [[Color]] ->
通过保持 IORef 来通过异常来维护状态似乎要容易得多。而不是尝试使用 State Monad。下面我们有 2 个替代的 State Monad。一用StateT和另一个 ReaderT IORef
我有一个必须以互斥方式执行的操作。在其他语言中,我可以做类似的事情(类似Python的伪代码): with myLock: # here lock is acquired do mutual
我有一个必须以互斥方式执行的操作。在其他语言中,我可以做类似的事情(类似Python的伪代码): with myLock: # here lock is acquired do mutual
我是一名优秀的程序员,十分优秀!