Пожалуйста, помогите мне понять концепцию внутренних и внешних монад - PullRequest
14 голосов
/ 24 марта 2012

Я еще не монад-джедай, но у меня есть общее представление о них.

Теперь я читаю несколько статей, в которых упоминается «внутренняя» и «внешняя» монада, и мне интересно, что это значит.

(ссылки на) примеры кода будут полезны.

Спасибо!

1 Ответ

19 голосов
/ 24 марта 2012

Многие приложения на 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.

...