在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类型类的方法.
据我了解[,]
>>运算符丢弃第一个参数的monadic结果,
不,它没有.它或多或少看起来Left像Maybemonad看到的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它实现为:
Run Code Online (Sandbox Code Playgroud)instance Monad (Either e) where Left l >>= _ = Left l Right r >>= k = k r
这意味着在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.无论我们如何绑定它.
| 归档时间: |
|
| 查看次数: |
120 次 |
| 最近记录: |