у нас есть как минимум 3 полурантаймовых рефлексии: — Generic — для обобщённого чтения данных, — Data — тоже для обобщённого чтения данных, но ещё и для записи, — Typeable — для идентификации типа.
и одна полностью компайлтаймовая — TemplateHaskell
например у тебя есть куча кода в IO. Но ему нужно окружение - конфиги, настройки, подключение к бд, порты. И чтобы не передавать через аргументы явно во всех функций, просто пишешь этот код в ReaderT AppEnv IO.