什么>>运营商呢?

gra*_*upa 3 monads haskell

我在Haskell学习monad.

在这里读到关于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  
Run Code Online (Sandbox Code Playgroud)

什么是>>在它不同于>>=

sep*_*p2k 16

>>是您不关心价值的捷径.也就是说,a >> b等同于a >>= \_ -> b(假设>>给定monad中的理智(或默认)定义).

所以,当你的时候,比如说,在IO单子,想要执行一些printS,您可以使用>>,因为没有理由做任何与()print生产:print a >> print b.

在do-notation方面exp >>= \var -> rest对应

do
  var <- exp
  rest
Run Code Online (Sandbox Code Playgroud)

并且exp >> rest对应于

do
  exp
  rest
Run Code Online (Sandbox Code Playgroud)


eps*_*lbe 6

>> 在左侧执行monadic动作但丢弃其结果然后执行右侧.

当你使用do - notation这就是当你写这样的东西时会发生的事情

... = do _ <- action1
         action2
Run Code Online (Sandbox Code Playgroud)

或更短(但编译器将发出未绑定的警告action1)

... = do action1
         action2
Run Code Online (Sandbox Code Playgroud)

现在哪里有用 - 考虑你所在的monadic解析器的情况

... = do string "IP:"
         d1 <- decimal
         char '.'
         d2 <- decimal
         char '.'
         d3 <- decimal
         char '.'
         d4 <- decimal
         char '.'
         return $ IP d1 d2 d3 d4
Run Code Online (Sandbox Code Playgroud)

在这里你感兴趣的是实际数字,但不是两者之间的点或开头的字符串"IP:".