Question

I'd like to stack ResourceT with the ReaderT monad. It seems I have two options: Either place ReaderT on the bottom or at the top of the stack.

data MyEnv

newtype MyT1 m a = MyT1 { unT1 :: ResourceT (ReaderT MyEnv m) a }

newtype MyT2 m a = MyT2 { unT2 :: ReaderT MyEnv (ResourceT m) a }

What would be better in sence of performance/correctness? What are the general guidelines for stacking ResourceT with WriterT or other monads?

Was it helpful?

Solution

As far as correctness goes, they are both equally correct -- see comments by @J.Abrahamson and @Michael Snoyman.

Performance probably depends on use, in particular it will change how many calls to lift cross that particular layer, which should be the main performance difference. I'd imagine most fair benchmarks would show little to no difference. For whole program performance, profiling is king.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top