Haskell STM碎片TVAR

时间:2013-01-05 14:35:39

标签: haskell stm tvar

我是Haskell和STM的新手,我正在努力理解基本概念。

在Haskell和一般的函数式编程中,如果我错了,请纠正我,没有像赋值这样的东西。

我无法写x=3;我所能做的就是与x3生成其他约束。

现在谈到TVar和线程,如果我有多个线程共享同一个TVar,如果一个线程更改了值writeTVar,其他线程将看到更改的值,我是对的?

因此,如果我有2个线程共享相同的TVar Int var,并且第一个添加1,如果成功,第二个线程将看到更新的值?

Thaks

2 个答案:

答案 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