2

我很难理解如何guard工作。为什么要进行类型检查?不能mzero返回一些m a地方a /= ()吗?

guard           :: (MonadPlus m) => Bool -> m ()
guard True      =  return ()
guard False     =  mzero

mzero :: m a 
4

1 回答 1

11

是的,mzero 能够返回一些m awhere a /= ()。但它也能够返回m ()guard在第二种情况下使用它。

它类似于:

n :: Int
n = 5

5可以是Floator Double,也可以是Int. 5编译器在类型检查期间选择所需的解释。

同样,编译器mzero在类型检查期间为原始示例选择正确的类型。更准确地说,它认为 am ()是必需的,所以它选择了那个类型。

这里重要的一点是

mzero :: MonadPlus m => m a

实际上意味着

mzero :: forall m a . MonadPlus m => m a

这表明调用者可以选择andmzero的实际值(只要是 a )。因此,调用者可以选择进行事物类型检查。这个选择可以由用户通过类型注解做出,否则编译器会在类型检查时尝试推断出正确的选择。mamMonadPlusa=()

于 2015-02-19T12:48:16.637 回答