что это за уравнение с лямбда-нотацией "m >> n = m >> = \ _ -> n" в объявлении монады? - PullRequest
13 голосов
/ 31 декабря 2011
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 Ответ

17 голосов
/ 31 декабря 2011

Это реализация по умолчанию для метода.Если ваше объявление экземпляра не содержит явную реализацию (>>), это определение будет использоваться.Методы по умолчанию широко распространены, если какой-либо метод может быть реализован с использованием другого метода, но потенциально могут быть более эффективные реализации для некоторых типов данных.

m >>= \_ -> n

означает, что «результат» m передается функции, котораяигнорирует его аргумент и возвращает n независимо от того,Это также может быть записано

m >>= const n

В контексте монад с эффектами, это 'do m, чтобы получить эффекты, но игнорировать возвращаемое значение, затем do n'.Вот что (>>) предназначено для этого.

...