2011-12-31 3 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 

이전에 typeclass에서 방정식 (또는 함수 선언?)을 본 적이 없었습니다. typeclass에 방정식이있는 이유는 무엇입니까?모나드의 선언에서 "m >> n = m >> = _ -> n"이라는 람다 표기법을 사용하는 방정식은 무엇입니까?

나는 을 알고 있습니다.은 어떤 것과도 일치하는 용어입니다. 하지만 무엇 m >> = \ _ -> n 일치합니까?

+1

방금 ​​** \\ _ -> n **이 첫 번째 매개 변수를 던졌습니다. – snow

답변

17

이 메소드의 기본 구현입니다. 인스턴스 선언에 명시 적 구현 인 (>>)이 포함되어 있지 않으면 사용되는 정의입니다. 일부 메소드가 다른 메소드를 사용하여 구현 될 수있는 경우 기본 메소드가 널리 보급되지만 일부 데이터 유형의 경우보다 효율적으로 구현 될 수 있습니다.

m >>= \_ -> n 

는 인수를 무시하고 n 상관없이 반환 함수에 공급된다 m의 '결과'를 의미한다. 그것은 또한 효과 모나드의 맥락에서

m >>= const n 

을 작성할 수 있습니다, 그것은 '다음 nm는 반환 값을 효과를 가지고 있지만, 무시 않는다'이다. 그것은 (>>)이 거기에서하기위한 것입니다.

관련 문제