我一直在试验严格和懒惰的STmonad,我不清楚每个人的懒惰程度.例如,使用惰性Control.Monad.State.Lazymonad我们可以写:
main = print $ (flip evalState) "a" $ do
forever $ put "b"
put "c"
get
Run Code Online (Sandbox Code Playgroud)
这很好,输出"c".双重地,严格Control.Monad.State.Strict变体的相同代码将put "b"永远运行,并挂起.
直观地说,我希望STmonad 具有相同的二元性.也就是说,给出代码:
main = print $ S.runST $ do
r <- newSTRef "a"
forever $ writeSTRef r "b"
writeSTRef r "c"
readSTRef r
Run Code Online (Sandbox Code Playgroud)
Control.Monad.ST.Lazy应该输出"c",同时Control.Monad.ST.Strict应该挂起.但是,它们都无限循环.我认为这是有正当理由的,例如:向后读,在调用r最后一个时尚未分配引用writeSTRef.但它感觉我们可以做得更好.
haskell ×1