Haskell mzero如何匹配保护类型签名?
我很难理解Haskell mzero如何匹配保护类型签名?,haskell,monads,alternative-functor,monadplus,Haskell,Monads,Alternative Functor,Monadplus,我很难理解guard的工作原理。为什么要进行类型检查?mzero是否能够返回一些ma其中a/=() 是的,mzero能够返回一些ma,其中a/=()。但是它也能够返回m()guard在第二种情况下使用它 与此类似: n :: Int n = 5 5可以是Float或Double,但也可以是Int。编译器在类型检查期间选择所需的5解释 类似地,编译器在类型检查期间为原始示例中的mzero选择正确的类型。更准确地说,它看到需要一个m(),所以它选择了该类型 这里最重要的一点是 mzero :: M
guard
的工作原理。为什么要进行类型检查?mzero
是否能够返回一些ma
其中a/=()
是的,mzero
能够返回一些ma
,其中a/=()
。但是它也能够返回m()
guard
在第二种情况下使用它
与此类似:
n :: Int
n = 5
5
可以是Float
或Double
,但也可以是Int
。编译器在类型检查期间选择所需的5
解释
类似地,编译器在类型检查期间为原始示例中的mzero
选择正确的类型。更准确地说,它看到需要一个m()
,所以它选择了该类型
这里最重要的一点是
mzero :: MonadPlus m => m a
实际上意味着
mzero :: forall m a . MonadPlus m => m a
这表明
mzero
的调用者可以选择m
和a
的实际值(只要m
是MonadPlus
)。因此,调用方可以选择a=()
进行类型检查。用户可以通过类型注释进行选择,否则编译器将在类型检查期间尝试推断正确的选择。顺便说一句,Haskell中没有类型不平等这回事。这里只有类型相等a~()
,与所有约束一样,假设这在原则上是正确的,即使编译器不能证明它,所以您永远不能否定约束。事实上,这里是真的,a~()
正是编译器对mzero
的推断!
mzero :: forall m a . MonadPlus m => m a