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

我以前从未在 typeclass 中看到过方程式(或函数声明?)。为什么 typeclass 中有一个方程?

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

4

1 回答 1

17

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

m >>= \_ -> n

表示 的“结果”m被馈送到忽略其参数并n无论如何都返回的函数。也可以写成

m >>= const n

在具有效果的 monad 的上下文中,它是“做m有效果,但忽略返回值,然后做n”。这就是(>>)在那里要做的。

于 2011-12-31T19:49:51.577 回答