Каждый тип, который является экземпляром Monad, должен иметь return
, равный pure
.
В частности, поскольку Applicative
был сделан суперклассом Monad
, return
не делаетНе нужно определять, потому что по умолчанию он определен как синоним pure
: см. определение :
Кроме того, операции Monad и Applicative должны соотноситься следующим образом:
Минимальное полное определение
(>>=)
Обратите внимание, что для минимального определения требуется только>>=
, а не return
и требование pure = return
(которое, как и все такие «законы», не может быть применено языком, но должно выполняться для всех «здравых» реализаций, иначе семантика не будет правильной).
Но есть типы, которые являются Аппликативными, но не Монадой, и поэтому имеют pure
, но не return
.ZipList
является традиционным примером.