ST有多严格

时间:2012-12-30 00:30:07

标签: haskell

ST Monad中STRef的严格程度如何?如果我给STRef写东西,我能确定它会在没有空间泄漏的情况下进行全面评估吗?

2 个答案:

答案 0 :(得分:6)

这是你可以轻松测试的事情。

Prelude Data.STRef Control.Monad.ST> :{
| runST $ do
|   newSTRef (error "strict!")
|   return "not strict!"
| :}
"not strict!"

答案 1 :(得分:6)

ST monad本身是严格的,因为它强制执行严格的事件排序。直观地说,当你评估runST时,你将不会得到任何信息“直到”所有内存的读写都完成了。但是,当涉及到严格执行时,这就是它。例如,STRef默认是惰性的(存在严格版本)。您可能希望恢复严格性,如

writeSTRef r $! 7

至于避免空间泄漏......这是一个更复杂的问题。只使用合适的monad就不够好了。