我是Haskell和STM的新手,我正在努力理解基本概念。
在Haskell和一般的函数式编程中,如果我错了,请纠正我,没有像赋值这样的东西。
我无法写x=3;
我所能做的就是与x
和3
生成其他约束。
现在谈到TVar和线程,如果我有多个线程共享同一个TVar,如果一个线程更改了值writeTVar
,其他线程将看到更改的值,我是对的?
因此,如果我有2个线程共享相同的TVar Int
var,并且第一个添加1,如果成功,第二个线程将看到更新的值?
Thaks
答案 0 :(得分:3)
是的,TVar
是容器,当内容发生变化时不会改变。所有线程都看到相同的容器,当一个线程更改容器中存储的内容时,当另一个线程看起来时,它会找到更改的值。
答案 1 :(得分:3)
最好不要将TVar
视为变量,而是可以读取和写入的通道。
纯变量可以被认为是一个纯函数,它总是返回一些值(这个值只绑定一次,就像在你的例子中一样)。
monad中的变量/函数有一些“上下文”(这就是monad所用的),可能会改变它的值(例如randomIO :: Random a => IO a
来自System.Random
可能被认为是“monadic value”,value,可以在任何电话上更改)。
读取和写入TVar
是非纯粹的显式操作,这就是函数readTVar
/ writeTVar
被包装到STM
monad中的原因,它们依赖于某些隐藏的上下文,这可能会改变结果(使线程之间的价值转移成为可能)。这将这些操作限制为STM
monad,但只能转义为IO
。