我很难理解如何guard
工作。为什么要进行类型检查?不能mzero
返回一些m a
地方a /= ()
吗?
guard :: (MonadPlus m) => Bool -> m ()
guard True = return ()
guard False = mzero
mzero :: m a
我很难理解如何guard
工作。为什么要进行类型检查?不能mzero
返回一些m a
地方a /= ()
吗?
guard :: (MonadPlus m) => Bool -> m ()
guard True = return ()
guard False = mzero
mzero :: m a
是的,mzero
能够返回一些m a
where a /= ()
。但它也能够返回m ()
。guard
在第二种情况下使用它。
它类似于:
n :: Int
n = 5
5
可以是Float
or Double
,也可以是Int
. 5
编译器在类型检查期间选择所需的解释。
同样,编译器mzero
在类型检查期间为原始示例选择正确的类型。更准确地说,它认为 am ()
是必需的,所以它选择了那个类型。
这里重要的一点是
mzero :: MonadPlus m => m a
实际上意味着
mzero :: forall m a . MonadPlus m => m a
这表明调用者可以选择andmzero
的实际值(只要是 a )。因此,调用者可以选择进行事物类型检查。这个选择可以由用户通过类型注解做出,否则编译器会在类型检查时尝试推断出正确的选择。m
a
m
MonadPlus
a=()