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 am ()的超集。

关于haskell - 'm a'vs 'm ()'在后卫,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4232511/

10-13 02:20