ResourceT Monad Transformer 的堆叠

11

我想将ResourceTReaderT单子叠加在一起。看来有两个选项:要么把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 }

在性能和正确性方面,哪种方法更好?堆叠ResourceTWriterT或其他单子的一般指南是什么?


11
有趣的是, ResourceT 实际上只是一个专门定制的 ReaderT monad——所有有趣的东西都在 lifted IO 操作中执行。我没有进行测速,但我的猜测是两个堆栈的速度相同。此外,阅读器通过 flip 进行交换,因此这两个堆栈应该在语义上是相同的。 - J. Abrahamson
7
@J.Abrahamson的评论对我来说似乎是正确答案。 - Michael Snoyman
1个回答

1
就正确性而言,它们都是正确的 - 请参见@J.Abrahamson和@Michael Snoyman的评论。
性能可能取决于使用情况,特别是它将改变通过该特定层交叉提升的调用次数,这应该是主要的性能差异。我想大多数公平的基准测试将显示很少或没有区别。对于整个程序性能,分析是关键。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接