guard :: (MonadPlus m) => Bool -> m ()
guard True = return ()
guard False = mzero
Prelude Control.Monad> :t mzero
mzero :: (MonadPlus m) => m a
在
guard
的False分支中,mzero
的类型为m a
,但是guard
的返回类型已指定为m ()
。因此,我不太理解为什么编译器不会对此抱怨。我的意思是,如果
mzero
返回的值类型为Maybe Int
,那么它当然与Maybe ()
不同,对吗? 最佳答案
编译器不会抱怨,因为m a
是m ()
的超集。
关于haskell - 'm a'vs 'm ()'在后卫,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4232511/