guard :: (MonadPlus m) => Bool -> m ()
guard True = return ()
guard False = mzero
Prelude Control.Monad> :t mzero
mzero :: (MonadPlus m) => m a
В ветви False guard
тип mzero
равен m a
, но тип возврата guard
указан как m ()
. Поэтому я не совсем понимаю, почему компилятор не будет жаловаться на это.
Я имею в виду, если mzero
возвращает значение, набранное как Maybe Int
, что, конечно, отличается от Maybe ()
, верно?