2012-03-24 7 views

Respuesta

19

Una gran cantidad de aplicaciones Haskell utilizan transformadores mónada, que son instancias de la clase de tipo

class MonadTrans t where 
    lift :: Monad m => m a -> t m a 

Lo que esto hace es permitir que usted combina el ambiente proporcionado por varias mónadas, envolviéndolos juntos. Por ejemplo, la mónada State s le da la capacidad de operar en el estado del tipo s que se enhebra automáticamente a través de su computación, mientras que la mónada Maybe le permite un cortocircuito. Pero si quieres tanto de esos efectos, a continuación, se pueden combinar mediante el uso de una versión transformador mónada de uno de los dos, como por ejemplo:

something :: StateT s Maybe a 

Aquí, StateT se define en el paquete mtl, y es similar a State excepto por dejar un lugar para otra mónada que se encuentra dentro de ella. Mediante el uso de transformadores de mónada como este, puede componer los efectos de varias mónadas de forma gradual.

En este caso, Maybe es la mónada interna, y StateT s Maybe es la mónada externa. Puede obtener desde la mónada interna a la mónada externa usando lift de la clase de tipo MonadTrans.

+1

Olvidó el parámetro de tipo de estado de 'StateT'; debería ser 'something :: StateT Foo Maybe a' donde' StateT Foo Maybe' es la mónada externa. – hammar

+0

@hammar Gracias por la corrección de pruebas. Corregido ahora. –

Cuestiones relacionadas