为什么这两个值都没有丢弃?

Bul*_* M. 3 monads haskell

ghci中有以下内容:

:m + Control.Monad.Error
let f x = Right x

Left 1.0 >> Right 1 >>= f
Run Code Online (Sandbox Code Playgroud)

Left 1.0
Run Code Online (Sandbox Code Playgroud)

据我了解>>运算符丢弃第一个参数的monadic结果,但我看到它在这里被保留.你能解释一下吗?

http://hackage.haskell.org/package/base-4.10.0.0/docs/src/Data.Either.html#Either

奇怪的是,该链接并未显示Either如何实现Monad类型类的方法.

Wil*_*sem 8

据我了解[,] >>运算符丢弃第一个参数的monadic结果,

不,它没有.它或多或少看起来LeftMaybemonad看到的Nothing(主要区别在于Left它还带有一个值).因此,它有时被用作"高级Maybe",例如可以携带错误消息.

(>>) :: Monad m => m a -> m b -> m b是一个f >> g等同于f >>= \_ -> g和的函数f >>= const g.这是Monad类型类中的默认实现.

这取决于如何(>>=) :: Monad m => m a -> (a -> m b) -> m b实施.

现在Either实现为:

instance Monad (Either e) where
    Left  l >>= _ = Left l
    Right r >>= k = k r
Run Code Online (Sandbox Code Playgroud)

这意味着在Left l左侧的情况下,如果左侧是a Right r,则忽略右侧,然后k将其应用于Right构造函数所包含的值.

因此,我们可以使用(为了清晰起见添加括号)替换您的查询:

   Left 1.0 >> Right 1 >>= f
=  (>>) (Left 1.0) (Right 1 >>= f)
-> Left 1.0
Run Code Online (Sandbox Code Playgroud)

从语义上你可以看到一个Either作为一个"更高级"版本Maybe,其中Left需要的地方Nothing.所以从某个时刻起Left x,它就会停留下来Left x.无论我们如何绑定它.