Предположим, что у меня есть простое объявление newtype
newtype Foo a = Foo { unFoo :: ReaderT Int IO a }
Я хочу создать экземпляр Foo из MonoBaseControl IO. Это должно быть легко, поскольку ReaderT Int IO уже является экземпляром ввода-вывода MonadBaseControl. Однако автоматическое получение его с помощью GeneralizedNewtypeDeriving не работает, потому что класс MonadBaseControl имеет связанный тип.
Как написать экземпляр ввода-вывода MonadBaseControl для Foo? defaultLiftBaseWith и defaultRestoreM должны быть полезны, но немного сложно расшифровать их типы.