2011-12-31 46 views
13
class Monad m where 
    return :: a -> m a 
    (>>=) :: m a -> (a -> m b) -> m b 
    (>>) :: m a -> m b -> m b 
    m >> n = m >>= \_ -> n 

    fail :: String -> m a 

我从来没有在类型类中看过方程(或函数声明?)。为什么类型类中有一个方程式?在monad的声明中,lambda表示法“m >> n = m >> = _ - > n”的这个方程是什么?

我知道_是用于匹配任何东西的术语。但是什么m >> = \ _ - > n匹配?

+1

我刚刚意识到** \\ _ - > n **会抛出第一个参数。 – snow 2011-12-31 19:56:43

回答

17

这是该方法的默认实现。除非您的实例声明包含明确的实现(>>),否则这就是将要使用的定义。如果某些方法可以使用另一种方法实现,则默认方法很普遍,但对于某些数据类型,可能会有更高效的实现。

m >>= \_ -> n 

指“结果”的m被馈送到忽略其参数,并返回n不管功能。这也可以写成

m >>= const n 

在单子与影响的背景下,这是“不m有效果,却忽略了返回值,然后做n”。这就是(>>)是要在那里做的。

相关问题