我想将ResourceT
与ReaderT
单子叠加在一起。看来有两个选项:要么把ReaderT
放在栈底,要么放在栈顶。
data MyEnv
newtype MyT1 m a = MyT1 { unT1 :: ResourceT (ReaderT MyEnv m) a }
newtype MyT2 m a = MyT2 { unT2 :: ReaderT MyEnv (ResourceT m) a }
在性能和正确性方面,哪种方法更好?堆叠ResourceT
与WriterT
或其他单子的一般指南是什么?
ResourceT
实际上只是一个专门定制的ReaderT
monad——所有有趣的东西都在 lifted IO 操作中执行。我没有进行测速,但我的猜测是两个堆栈的速度相同。此外,阅读器通过flip
进行交换,因此这两个堆栈应该在语义上是相同的。 - J. Abrahamson