我在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)
>> 在左侧执行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:".