El patrón ReaderT es una guía de arquitectura recomendada en Haskell para estructurar aplicaciones con estado de configuración y acceso a funciones globales. Consiste en definir un tipo de datos central, llamado habitualmente Env, que agrupa toda la configuración en tiempo de ejecución y las funciones globales susceptibles de ser simuladas, como el registro de logs o el acceso a bases de datos. Si se requiere estado mutable, se introduce en Env como referencia mutable (IORef o TVar). El código de la aplicación vive, por defecto, en el contexto ReaderT Env IO, que puede abreviarse como App. Sobre esa base se permite añadir transformadores de mónada adicionales solo en subconjuntos reducidos, preferentemente de código puro. Opcionalmente, las funciones pueden escribirse contra clases de tipo estilo mtl, como MonadReader y MonadIO, para conservar algo de la pureza perdida al usar IO y referencias mutables.
El artículo desaconseja tres alternativas habituales: el uso de directivas CPP en tiempo de compilación, que multiplica las configuraciones de build; el empleo de variables globales inicializadas con unsafePerformIO, que introduce no determinismo y excepciones opacas; y el uso de WriterT y StateT, porque la pureza que aportan es engañosa en una aplicación real, su estado se pierde ante excepciones y no se comportan bien bajo concurrencia. Frente a esas opciones, el patrón ReaderT centraliza la inicialización en main, facilita añadir nuevos valores de configuración y permite ajustar dinámicamente el nivel de log mediante la función local. El texto se enmarca como opinión personal del autor, basada en su experiencia con el framework Yesod y el código base de Stack.
