我在Haskell学习monad。
我读了here关于Monads的一个非常好的解释,我想要理解(不是全部,但我刚刚开始)关于>>=
绑定运算符和Monad。
在我老师的幻灯片上,我发现了这个:
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b -- "bind"
(>>) :: m a -> m b -> m b -- "then"
return :: a -> m a
什么是>>
及其与>>=
的区别?
答案 0 :(得分:15)
>>
是您不关心价值的捷径。也就是说,a >> b
相当于a >>= \_ -> b
(假设给定monad中>>
的理智(或默认)定义。)
因此,当您在IO monad中想要执行某些print
时,您可以使用>>
,因为没有理由对其执行任何操作()
生成的print
print a >> print b
。
在do-notation方面exp >>= \var -> rest
对应
do
var <- exp
rest
和exp >> rest
仅对应
do
exp
rest
答案 1 :(得分:6)
>>
执行左侧的monadic动作,但丢弃其结果,然后执行右侧。
当你使用do - notation时,这就是你写
之类的东西时会发生的事情... = do _ <- action1
action2
或更短(但编译器将发出未绑定action1
)
... = do action1
action2
现在哪里有用 - 考虑一下你在哪里的monadic解析器的情况
... = do string "IP:"
d1 <- decimal
char '.'
d2 <- decimal
char '.'
d3 <- decimal
char '.'
d4 <- decimal
char '.'
return $ IP d1 d2 d3 d4
这里你感兴趣的是实际数字,但不是两者之间的点或开头的字符串“IP:”。
答案 2 :(得分:1)
>>
运算符用作>>=
运算符,在函数不需要第一个monadic运算符生成的值时使用。
为了更好地理解它,与do
符号的比较很有用:
(&gt;&gt;)(then)运算符几乎完全相同的符号和 在unsugared代码中。 [here]
你可以更好地看一下这个例子:
putStr "Hello" >>
putStr " " >>
putStr "world!" >>
putStr "\n"
相当于:
do putStr "Hello"
putStr " "
putStr "world!"
putStr "\n"