2010-11-17 24 views
19

usar la ortografía par de Writer todo el tiempo, pero siempre tiene que crear una instancia de mí mismo:¿La instancia `Monad ((,) w)` es estándar?

instance (Monoid w) => Monad ((,) w) where 
    return x = (mempty, x) 
    ~(w,x) >>= f = let (w', y) = f x in (w `mappend` w', y) 

¿Este viven en cualquier lugar de las librerías estándar?

+7

Ahora que lo mencionas, es curioso que 'Control.Monad.Instances' contenga la instancia' Functor' para '(()) a)' pero no una instancia 'Monad', a pesar de tener el lector anónimo' ((->) e) 'y error anónimo' E e'. –

+0

Vea también http://stackoverflow.com/questions/4211150/why-isnt-implemented-with-control-monad-instances-by-default –

+0

@McCann: ¿Cómo implementa una instancia de Monad para '((,) a) ' Por ejemplo, no tengo ni idea de cómo implementar 'return'. –

Respuesta

8

Como se menciona en el comentario de camccann, Control.Monad.Instances define solo la instancia Functor.

Control.Monad.Applicative define la instancia Applicative.

El paquete transformers, y por lo tanto también la versión 2 y superior del paquete mtl, definen una función de contenedor writer :: (a, w) -> Writer w a.

Pero no he encontrado la instancia Monad en ningún lado.

Cuestiones relacionadas