guard :: (MonadPlus m) => Bool -> m ()
guard True  = return ()
guard False = mzero
Prelude Control.Monad> :t mzero
mzero :: (MonadPlus m) => m a
在False分支中guard,类型为mzerois m a,但返回类型guard已被指定为m ().因此我不太明白为什么编译器不会抱怨这个.
我的意思是如果mzero返回一个键入的值Maybe Int,当然,这是不同的Maybe (),对吗?
编译器不会抱怨,因为它m a是一个超集m ().