3

ST Monad中的STRef有多严格?如果我向 STRef 写一些东西,我能确定它会在没有空间泄漏的情况下得到全面评估吗?

4

2 回答 2

6

这是您可以轻松测试自己的事情。

Prelude Data.STRef Control.Monad.ST> :{
| runST $ do
|   newSTRef (error "strict!")
|   return "not strict!"
| :}
"not strict!"
于 2012-12-30T00:34:36.610 回答
6

STmonad 本身是严格的,因为它强制执行严格的事件排序。直观地说,当您评估时,runST您不会“直到”所有从内存中读取和写入的信息都完成。但是,在执行严格性方面就是这样。例如,STRef默认是惰性的(存在严格版本)。您可能想要恢复严格性,例如

writeSTRef r $! 7

至于避免空间泄漏……这是一个更复杂的问题。仅仅使用正确的 monad 是不够的。

于 2012-12-30T00:40:03.097 回答