什么>>运营商呢?

时间:2016-05-10 10:47:59

标签: haskell monads

我在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  

什么是>>及其与>>=的区别?

3 个答案:

答案 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"