Ответ 1
Он поставляется из пакета monad-control и является одним из двух классов типов (другой MonadTransControl), которые улучшают MonadBase (соответственно MonadTrans), поддерживая альтернативу liftBase
(соответственно lift
) для монодаров, которые ее реализуют. Эта расширенная версия больше не принимает простых действий в абсолютной базовой монаде (соответственно немедленной базовой монаде), но вместо этого принимает функцию, которая получает полное состояние базовой монады (соответственно монада-трансформатора) в этой точке в качестве единственного параметра и возвращает вышеупомянутое действие.
Как указывается в документации к пакету, это усовершенствование, наряду с остальной частью содержимого этих классов типов, позволяет вам снимать функции, такие как catch
, alloca
и forkIO
из абсолютной базовой монады (соответственно. немедленная базовая монада), что невозможно в более простой схеме, представленной в MonadBase (соответственно MonadTrans), потому что последняя пара не позволяет вам поднять аргументы функции, просто результаты, в то время как подход, используемый monad-control, позволяет обоим.
В результате набор монадов (соответственно монад-трансформаторов), которые можно использовать с MonadBaseControl (соответственно MonadTransControl) является строгим подмножеством множества монад, которые можно использовать с MonadBase (соответственно MonadTrans), но первые группы намного сильнее, чем последние по той же причине.