STRef 和 IORef 之间到底有什么区别?何时使用它们?据我所知,它们都是可变状态,那么它们存在的意义是什么?
您可以在其中做更多事情IO
单子比ST
单子。后者提供可变引用,前者提供可变引用、异常捕获、线程,当然还有IO。
使用可以解决问题的“最弱”或“更受限制”的工具通常是很好的 Haskell 实践,因为“较弱”的工具往往更容易理解和分析(Haskell 中出现这一原则的另一个地方是Applicative
versus Monad
区别)。
所以,如果你only需要可变引用,使用ST
。未来的维护者将能够通过查看类型来推断更多关于您的函数做什么(和不做什么)的信息。
您被迫使用的示例情况IORef
s(或他们的表兄弟MVar
s) 是当必须在两个不同的执行线程之间共享可变引用时。
还要记住,你可以逃脱ST
(这意味着你可以运行ST
纯函数内部的计算)但你无法逃脱IO
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)