在monad的声明中,lambda符号“m>> n = m>> = \ _ - > n”这个等式是什么?

时间:2011-12-31 19:44:39

标签: haskell lambda monads lambda-calculus

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

我以前从未见过类型类中的等式(或函数声明?)。为什么在类型类中有一个等式?

我知道 _ 是匹配任何内容的术语。但 m>> = \ _ - > n 匹配?

1 个答案:

答案 0 :(得分:17)

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

m >>= \_ -> n

表示m的'result'被赋予忽略其参数的函数,并返回n无论如何。它也可以写成

m >>= const n

在具有效果的monad的上下文中,具有效果的'm,但忽略返回值,然后执行n'。这就是(>>)在那里的意思。