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

sno*_*now 13 monads lambda haskell 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
Run Code Online (Sandbox Code Playgroud)

我以前从未在类型类中看过方程式(或函数声明?).为什么在类型类中有一个等式?

我知道_是一个匹配任何东西的术语.但是m >> =\_ - > n匹配?

Dan*_*her 17

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

m >>= \_ -> n
Run Code Online (Sandbox Code Playgroud)

意味着'结果' m被输入到忽略其参数的函数并且n无论如何返回.它也可以写

m >>= const n
Run Code Online (Sandbox Code Playgroud)

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