Пожалуйста, помогите мне понять концепцию внутренней и внешней монад
Я еще не монад-джедай, но у меня есть общее понимание.
Теперь я прочитал несколько статей, в которых упоминается "внутренняя" и "внешняя" монада, и мне интересно, что это значит.
(Ссылки на) примеры кода будут полезны.
Спасибо!
Ответ 1
Многие приложения 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.