Штабелирование трансформатора Monat

Я хотел бы складывать 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 или других монадов?

Ответ 1

Что касается правильности, то они одинаково правильны - см. комментарии @J.Abrahamson и @Michael Snoyman.

Производительность, вероятно, зависит от использования, в частности, это изменит количество вызовов, которые нужно поднять, чтобы пересечь этот конкретный уровень, что должно быть основной разницей в производительности. Я бы предположил, что самые честные тесты не показывают никакой разницы. Для всей производительности программы профилирование является королем.