2011-11-03 11 views
6

En cuanto a la documentación para Control.Applicative, I cuenta de que tienen declaraciones de instancia para ciertos mónadas (por ejemplo IO, Maybe y notablemente ST), pero no existen instancias para mónadas MTL como State y RWS. En su lugar, parece que hay un tipo de propósito general WrappedMonad definido, que supongo que cubrirá todos los demás casos.¿Instancia aplicable para el estado y otras mónadas de MTL?

Así que aquí están mis preguntas:

  1. Por qué no hay Applicative casos de mónadas MTL? La mejor respuesta que he podido encontrar hasta ahora es three year old post, donde alguien implementó estas instancias y fue ignorado sumariamente.

  2. ¿Cuál es el problema con WrappedMonad? Encontré un post on Reddit que lo explica brevemente, pero creo que estoy confundido acerca de cómo usarlo.

En última instancia me gustaría ser capaz de utilizar State en un estilo aplicativo (como era recommended to me), pero si tengo que mi código de arena con WrappedMonad constructores de datos y luego no lo hace parecer como una victoria. También podría ignorar por completo WrappedMonad, y definir la instancia Applicative de la misma manera que se hizo para IO, ST y así sucesivamente: en términos de return y ap ... Pero eso parece ridículo también.

+0

Si solo tuviéramos Functor => Applicative => Monad, y (Alternativa, Monad) => MonadPlus – alternative

Respuesta

8

Esa documentación se genera basándose únicamente en el contenido del paquete base, que no contiene State, por lo que no contiene Applicative instancias para él. Si mira en the MTL documentation, verá una instancia de Applicative en la lista.

alternativa, puede abrir GHCi, Control.Monad.State importación y Control.Applicative, y utilizar :i Applicative para enumerar los casos de Applicative o :i StateT para enumerar las clases para las que ha StateT casos (State es un alias de tipo para StateT con uno de sus parámetros corregidos). Cualquiera de los dos mostrará que efectivamente existe tal instancia.

+0

Evidentemente estoy ciego como un murciélago. Estaba viendo esa documentación exacta y no vi la instancia 'Applicative'. – mergeconflict

2

Las instancias aplicables para mtl mónadas no se pueden enumerar en los documentos base, porque no hay mtl disponible en ese punto. La buena noticia es que mtl tiene instancias aplicables StateT for example, desde mtl-2.0.0.0.

Cuestiones relacionadas