2012-03-24 8 views

Antwort

19

Viele Haskell-Anwendungen verwenden Monade Transformatoren, die Instanzen der Typklasse sind

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

Was das bedeutet ist, können Sie die Umgebung durch mehrere Monaden vorgesehen kombinieren, indem sie zusammen wickeln. Zum Beispiel gibt Ihnen die State s Monade die Möglichkeit, im Zustand s zu arbeiten, der automatisch durch Ihre Berechnung gefädelt wird, während die Maybe Monade einen Kurzschlussfehler verursacht. Aber wenn Sie beide dieser Effekte wollen, dann können Sie sie kombinieren, indem eine Monade Transformator Version von einem der beiden mit, wie zum Beispiel:

something :: StateT s Maybe a 

Hier wird StateT im mtl Paket definiert und ist ähnlich wie State, bis auf einen Platz für eine andere Monade, die darin sitzt. Durch die Verwendung von Monad-Transformatoren können Sie die Effekte von mehreren Monaden stückweise zusammenstellen. In diesem Fall ist Maybe die innere Monade und StateT s Maybe die äußere Monade. Sie können von der inneren Monade zur äußeren Monade gelangen, indem Sie lift aus der MonadTrans Klasse verwenden.

+1

Sie haben den Zustandstyp-Parameter 'StateT' weggelassen; Es sollte "etwas" sein: StateT Foo Vielleicht ein "wo" StateT Foo Maybe "ist die äußere Monade. – hammar

+0

@hammar Danke für das Korrekturlesen. Jetzt behoben. –

Verwandte Themen