Многие приложения на Haskell используют монадные преобразователи, которые являются экземплярами класса типов
class MonadTrans t where
lift :: Monad m => m a -> t m a
То, что это делает, позволяет вам объединять среду, обеспечиваемую несколькими монадами, объединяя их вместе. Например, монада State s
дает вам возможность работать в состоянии типа s
, которое автоматически пронизывает ваши вычисления, в то время как монада Maybe
допускает сбой короткого замыкания. Но если вы хотите оба этих эффектов, то вы можете объединить их, используя версию монадного преобразователя одного из двух, например:
something :: StateT s Maybe a
Здесь StateT
определен в пакете mtl
и похож на State
за исключением того, что оставляет место для другой монады, которая находится внутри нее. Используя такие монадные преобразователи, вы можете составлять эффекты нескольких монад по частям.
В этом случае Maybe
- это внутренняя монада, а StateT s Maybe
- это внешняя монада. Вы можете перейти от внутренней монады к внешней, используя lift
из класса MonadTrans
.