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

Nunca he visto una ecuación (o declaración de función?) En la clase de tipos anterior. ¿Por qué hay una ecuación en typeclass?¿cuál es esta ecuación con la notación lambda "m >> n = m >> = _ -> n" en la declaración de mónada?

_ es un término para hacer coincidir cualquier cosa. pero ¿con qué m >> = \ _ -> n coinciden?

+1

Me acabo de dar cuenta de que ** \\ _ -> n ** arroja el primer parámetro. – snow

Respuesta

17

Es una implementación predeterminada para el método. A menos que su declaración de instancia contenga una implementación explícita de (>>), esa es la definición que se usará. Los métodos predeterminados están muy extendidos si se puede implementar algún método usando otro método, pero potencialmente puede haber implementaciones más eficientes para algunos tipos de datos.

m >>= \_ -> n 

significa que el 'resultado' de m se alimenta a la función que hace caso omiso de su argumento y devuelve n no importa. También se podría escribir

m >>= const n 

En el contexto de las mónadas con efectos, es 'hacer m que tienen los efectos, pero ignoran el valor de retorno, y luego hacer n'. Eso es lo que debe hacer (>>) allí.

Cuestiones relacionadas