Почему последовательность требует монады, если будет достаточно аппликативного? - PullRequest
5 голосов
/ 03 апреля 2019

Подпись последовательности

sequence :: Monad m => t (m a) -> m (t a)

Но мы можем реализовать это как

sequence = traverse id

требует, чтобы m было просто Applicative. Если монады являются аппликативными, то зачем беспокоиться о наличии такого ограничения на уровне типа?

1 Ответ

5 голосов
/ 03 апреля 2019

В Haskell есть много функций, которые эквивалентны, но различны, потому что Applicative (соответственно Functor) не был суперклассом Monad.Например:

  • return против pure

  • ap против <*>

  • liftM против liftA против fmap

  • liftM2, liftM3 и т. Д.против liftA2, liftA3 и т. д.

  • mapM / forM против traverse / for

  • mapM_ / forM_ против traverse_ / for_

  • sequence против sequenceA

  • mzero & mplus (от MonadPlus) против empty & <|> (от Alternative)

Старые функции с их оригинальными Monad сигнатурамивсе еще присутствуют, но в новом коде, поскольку было реализовано Applicative-Monad Proposal (AMP) , вы всегда можете использовать Applicative версии, потому что они немного более общие, то есть вы всегда можетезамените return на pure, но не наоборот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...