2011-11-03 8 views
6

Guardando la documentazione per Control.Applicative, ho notato che essi hanno le dichiarazioni di istanza per alcuni monadi (ad esempio IO, Maybe e in particolare ST), ma non ci sono casi di monadi MTL quali State e RWS. Sembra invece che sia definito un tipo generico WrappedMonad, che suppongo copra tutti gli altri casi.Istanza applicativa per stato e altre monadi MTL?

Così qui sono le mie domande:

  1. Perché non ci sono Applicative istanze per monadi MTL? La risposta migliore che sono riuscito a trovare da sola è una three year old post, in cui qualcuno ha implementato queste istanze ed è stata sommariamente ignorata.

  2. Qual è l'accordo con WrappedMonad? Ho trovato un post on Reddit che lo spiega brevemente, ma penso di essere confuso su come usarlo.

In definitiva mi piacerebbe essere in grado di utilizzare State in uno stile applicativo (come era recommended to me), ma se devo cucciolata il mio codice con WrappedMonad costruttori di dati allora non sembrare come una vittoria. Potrei anche ignorare completamente WrappedMonad e definire l'istanza Applicative allo stesso modo in cui è stata eseguita per IO, ST e così via: in termini di return e ap ... Ma anche questo sembra sciocco.

+0

Se solo avessimo Functor => Applicativo => Monade, e (Alternativa, Monade) => MonadPlus – alternative

risposta

8

Tale documentazione viene generata basandosi esclusivamente sul contenuto del pacchetto base, che non contiene State, pertanto non contiene istanze Applicative. Se guardi su the MTL documentation, vedrai elencata un'istanza Applicative.

In alternativa, è possibile aprire GHCi, l'importazione e Control.Monad.State Control.Applicative, e utilizzare :i Applicative per elencare le istanze di Applicative o :i StateT per elencare le classi per le quali StateT ha casi (State è un tipo alias per StateT con uno dei suoi parametri riparati). O mostrerà che c'è davvero una tale istanza.

+0

Evidentemente sono cieco come un pipistrello. Stavo guardando quella documentazione esatta e non ho visto l'istanza 'Applicativa'. – mergeconflict

2

Le istanze Applicative per le monadi mtl non possono essere elencate nei documenti di base, perché non ci sono mtl disponibili in quel punto. La buona notizia è che mtl ha istanze Applicative StateT for example, poiché mtl-2.0.0.0.