- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在处理Write Yourself a Scheme in 48 Hours (我已经完成了大约 85 小时)并且我已经完成了关于 Adding Variables and Assignments 的部分。本章中有一个很大的概念跳跃,我希望它是分两步完成的,中间有良好的重构,而不是直接跳到最终的解决方案。无论如何……
我迷失了许多似乎具有相同目的的不同类:State
、ST
、IORef
和MVar
。文中提到了前三个,而最后一个似乎是 StackOverflow 上有关前三个的许多问题的首选答案。它们似乎都在连续调用之间携带一种状态。
它们各自是什么以及它们之间有何不同?
<小时/>特别是这些句子没有意义:
Instead, we use a feature called state threads, letting Haskell manage the aggregate state for us. This lets us treat mutable variables as we would in any other programming language, using functions to get or set variables.
和
The IORef module lets you use stateful variables within the IO monad.
所有这些都使得 type ENV = IORef [(String, IORef LispVal)]
行变得令人困惑 - 为什么是第二个 IORef
?如果我改写 type ENV = State [(String, LispVal)]
会破坏什么?
最佳答案
状态 Monad:可变状态模型
State monad 是一个纯函数式环境,适用于具有状态的程序,具有简单的 API:
the mtl package 中的文档.
当在单个控制线程中需要状态时,通常使用状态单子(monad)。它在其实现中实际上并未使用可变状态。相反,程序由状态值参数化(即状态是所有计算的附加参数)。状态似乎只在单个线程中发生变化(并且不能在线程之间共享)。
ST monad 和 STRef
ST monad 是 IO monad 的受限制表亲。
它允许任意可变状态,实现为机器上的实际可变内存。该 API 在无副作用的程序中是安全的,因为 2 级类型参数可防止依赖于可变状态的值逃逸本地范围。
因此,它允许在其他纯程序中控制可变性。
通常用于可变数组和其他先发生变化然后卡住的数据结构。它也非常高效,因为可变状态是“硬件加速的”。
主要API:
将其视为 IO monad 危险性较小的兄弟。或者IO,只能读取和写入内存。
IORef:IO 中的 STRef
这些是 IO monad 中的 STRef(见上文)。它们没有与 STRef 相同的局部性安全保证。
MVar:带锁的 IORef
与 STRef 或 IORef 类似,但附加了锁,以便从多个线程进行安全的并发访问。仅当使用atomicModifyIORef(比较和交换原子操作)时,IORef 和 STRef 在多线程设置中才是安全的。 MVar 是一种更通用的安全共享可变状态的机制。
通常,在 Haskell 中,使用 MVar 或 TVar(基于 STM 的可变单元),而不是 STRef 或 IORef。
关于variables - State、ST、IORef 和 MVar 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5545517/
我是 C 的新手,在练习中,我必须编写以下代码部分的输出,即 3。但我不明白为什么会这样。 int main() { char st[100]="efgh"; printf ("\n%
我遇到了这个错误: java.lang.IllegalArgumentException: Removing a detached instance model.student 然后我在stackov
python 3.8.10Ubuntu 20.04 使用 st_aggrid (用于 Streamlit 的 AgGrid 的 Python 端口。) Streamlit 允许使用 st.column
这篇文章是识字的Haskell。只需放入“pad.lhs”之类的文件,ghci就可以运行它。 > {-# LANGUAGE GADTs, Rank2Types #-} > import Control
我有一个 NUCLEO-F401RE board (与 STM32F401RE ) 它在大多数情况下都运行良好。最近在这里,我按照书中的一个教程 "Mastering STM32 " 它说安装的地方
最近一两个月一直在学习Haskell,最近解决了this编码问题。额外的挑战是在没有额外空间和线性时间的情况下完成任务,我认为这不可能以纯函数的方式完成,所以自然而然地我发现了 ST monad,我认
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 4 年前。 Improve t
我已经搜索过堆栈溢出,但没有一个能真正解决我的问题。 我能够为我的库构建 .so 文件并将其加载到 jniLibs 目录中。当我运行应用程序时,我得到了这个 java.lang.Unsatisfied
我在类加载器方面遇到问题。有时有效,有时无效。 当我开始时,我已经测试了它的工作原理,但不是从 *.jar 测试的: URL url = AcAnalyzer.class.getResource(".
我正在玩http://hackage.haskell.org/packages/archive/vault/0.2.0.0/doc/html/Data-Vault-ST.html并想要编写如下所示的函
为什么 ST 被设计为禁止使用以下代码 as shown in the wikibook ?这篇文章似乎表明,如果允许的话,ST 效果会泄漏到另一个 ST 中,但我不太明白为什么。 我似乎无法运行特定
我最近开始在 Hackage 上查看核心库,并且有一个反复出现的习惯用法我不明白。这是 ST module 中的一个示例: instance Monad (ST s) where {-# IN
如果输入 url 重新启动(他们在 rtmp 流中添加新视频)然后在我的 ffmpeg 我看到这个 PTS 4294794919, next:104020298 invalid dropping st
ST monad 在 GHC 中有特殊的编译器支持吗? 最佳答案 您可以在此处查看 STRefs 的代码:http://haskell.org/ghc/docs/latest/html/librari
我确信这将是一个简单的项目,但有一个作为测试启动的项目。 创建后,它被保存为“Project2.dpr” 现在测试不再是“测试”,我想将项目名称更改为更有意义的名称。 最好的方法是什么? 仅将文件名和
我有一些代码目前使用 ST monad 进行评估。我喜欢不要把 IO 放在任何地方,因为 runST方法产生一个纯结果,并表明这样的结果是可以安全调用的(相对于 unsafePerformIO )。但
我正在努力实现 UCT Haskell 中的算法,需要大量的数据处理。无需过多讨论,它是一种模拟算法,在每个“步骤”中,根据某些统计属性选择搜索树中的叶节点,在该叶处构造一个新的子节点,以及与该叶节点
我想学习使用 ST-Monad。因此,我想为每个整数重写一些代码计算——直到一个极限——所有它的真因数的列表。结果应该是一个数组,索引“n”的条目应该是它的真除数的列表。 这是通过为每个整数“n”计算
我在 ST 中有一个计算,它通过 Data.Vector.Unboxed.Mutable 分配内存。该向量永远不会被读取或写入,也不会在 runST 之外保留任何对其的引用(据我所知)。我遇到的问
以下代码创建数组,初始化,然后返回不可变数组。 import Data.Array import Control.Monad.ST import Data.Array.ST import qualif
我是一名优秀的程序员,十分优秀!