s (ExceptT a m) при том что instance MonadState s (ExceptT a m) вроде требует MonadState s m. Это связанно с Overlappable instances? Можно ли это как-то устранить (пусть не для самого MonadState, а для какой-нибудь своей обёртки над ним)?
Could not deduce (S.MonadState s m)
arising from the superclasses of an instance declaration
from the context: (Monad m, S.MonadState s (ExceptT a m))
bound by a quantified context
То, что инстанс с эксептом требует инстанс другой монады, ещё не значит, что все инстансы с эксептом получились именно таким образом
Например потому тайпклассы в коре компилируются в явную работу со словарями, и если что-то можно вывести в тайпчекере это /должно/ означать это что-то можно вытащить из соответствующего словаря, e.g. class Monad m => MonadState s m | m -> s where get :: m s put :: s -> m () ... instance MonadState s m => MonadState s (ExceptT e m) where get = liftExceptT get put = liftExceptT . put ... =>> data MonadState s m = MonadState { superclass :: Monad m , get :: m s , put :: s -> m () } monadStateExceptT :: MonadState s m -> MonadState s (ExceptT e m) monadStateExceptT MonadState{superclass, get, put} = MonadState { superclass = monadExceptT superclass , get = liftExceptT get , put = liftExceptT . put } соответственно вывести MonadState s m => Monad m можно, потому что это был суперкласс и он превратился в поле, а MonadState s (ExceptT m) в себе MonadState s m не содержит, имея на руках первый вы никак не получите второй. Определение data MonadState создается исключительно на основе определения класса, а там ничего про взаимоотношения ExceptT e m и m не сказано. То есть аналогия с обычным рекордом: у вас есть data Foo = Foo Int Int, вы создали x = Foo (fib 10) (fib 20), и теперь спрашиваете, как имея x вам получить fib, ведь она использовалась при его создании. Ответ - никак
Потому что механизм вывода работает в обратную сторону. Все написанные руками инстансы для mtl/transformers - которые и обеспечивают вывод, выглядят наподобие такого: instance MonadState s m => MonadState s (ExceptT m)
Обсуждают сегодня