我试图找出Clojure所称的STM与Haskell中实现的STM之间的区别。撇开实际语言语义的差异,我有点困惑,因为Rich Hickey在他的演讲中说Clojure的STM实现与其他任何东西都非常不同,但我除了语言选择以外不理解这些差异。
我试图找出Clojure所称的STM与Haskell中实现的STM之间的区别。撇开实际语言语义的差异,我有点困惑,因为Rich Hickey在他的演讲中说Clojure的STM实现与其他任何东西都非常不同,但我除了语言选择以外不理解这些差异。
Clojure STM有三个独特的特点:
有关Haskell STM,请参阅SPJ的论文:http://research.microsoft.com/en-us/um/people/simonpj/papers/stm/
"可组合的内存事务"和"带数据不变量的事务性内存"特别有用。 GHC实现的STM确实不是MVCC。 我记不清所有的实现细节,但我的理解是论文中的描述与目前在GHC中存在的描述并没有太大不同。
(请注意,MVCC在Clojure或其他地方都可以实现写入偏斜——例如,请参见此处:http://en.wikipedia.org/wiki/Snapshot_isolation)
orElse
组合器用于原子地组合交易。 - Don StewartSTM
是一个MonadPlus
,它允许您在事务上下文中指定额外的失败条件。例如,如果最终账户余额为负,则失败/重试该事务。它还允许您轻松地与其他MonadPlus
类共享该逻辑;给定一组帐户和购买,相同的函数将显示所有潜在有效交易的结果。如果逻辑复杂,这可能很有用。我认为Clojure都不可能实现这两个功能。 - Dax Fohl