Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell mzero如何匹配保护类型签名?_Haskell_Monads_Alternative Functor_Monadplus - Fatal编程技术网

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