【问题标题】:Stacking ResourceT monad transformer堆叠 ResourceT monad 转换器
【发布时间】:2014-03-18 01:42:21
【问题描述】:

我想将ResourceTReaderT monad 叠加。看来我有两个选择: 将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 或其他 monad 堆叠在一起的一般准则是什么?

【问题讨论】:

  • 有趣的是,ResourceT 本身只是一个专门的 ReaderT monad——所有有趣的东西都在提升的 IO 操作中执行。我没有把它放在板凳上,但我的猜测是两个堆栈都同样快。此外,读者通勤(通过flip),所以两个堆栈在语义上应该是相同的。
  • @J.Abrahamson 的 cmets 看起来是我的正确答案。

标签: haskell monad-transformers


【解决方案1】:

就正确性而言,它们都同样正确——参见@J.Abrahamson 和@Michael Snoyman 的 cmets。

性能可能取决于使用情况,特别是它会改变多少次调用来提升跨越该特定层,这应该是主要的性能差异。我想大多数公平的基准测试几乎没有差异。对于整个程序的性能,分析是王道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多