2015-09-29 10 views
9

Così Real World Haskell dice:È davvero una pratica predefinita rendere ogni trasformatore monad un'istanza di MonadTrans?

Ogni trasformatore monade è un esempio di MonadTrans

ma sto giocando con Scotty e ha scoperto che la sua base monade trasformatore ScottyT è non un'istanza di MonadTrans.

Guardando le note di rilascio sembra che si tratti di una decisione intenzionale: here. Codice:

I parametri Monad di ScottyT sono stati disaccoppiati, causando il cambiamento del tipo di costruttore ScottyT. Di conseguenza, ScottyT non è più un'istanza MonadTrans ...

Spero che tu capisca la mia confusione. Tuttavia, cercherò di formulare domande rigorose:

  • Perché non si desidera che un trasformatore monad sia un'istanza di MonadTrans?
  • Come spiegheresti il ​​cambiamento di cui sopra nel design ScottyT?

P.S .: Capisco che sia possibile definire un'istanza di MonadTrans ScottyT da solo, ma dovrei? (rimanda alle domande)

+6

Forse la domanda è "È' ScottyT' un trasformatore monade se non è un'istanza di 'MonadTrans'?" – crockeea

+0

Grazie, Eric, mi è saltato in testa, ma se guardi f.x. a https://en.wikibooks.org/wiki/Haskell/Monad_transformers non afferma mai che MonadTrans è un prerequisito per qualcosa di essere un trasformatore di monade. È più fraseggio come bello da avere. controlla la riga: 'Tecnicamente, questo è tutto ciò di cui abbiamo bisogno; tuttavia, è conveniente rendere MaybeT un'istanza di poche altre classi' – forker

risposta

10

ScottyT non è un trasformatore monad. Facciamo INLINE la (semplificato) Definizione:

newtype ScottyT' m a = ScottyT' { 
    runS :: State [ (Request->m Response) -> Request->m Response ] a 
    } 

Per definire lift per questo si avrebbe bisogno, da un generale m a azione e un tale elenco middleware, devono ottenere un valore effettivo a, perché State s cede valori unmonadic effettivi. Non c'è modo di farlo.

Ora, se lei sostiene che MonadTrans non è effettivamente necessaria per qualcosa di essere un trasformatore monade: matematicamente parlando, trasformatori monade corrispondono ad una composizione di funtori, ma in realtà non ScottyT attuare una tale composizione.

+1

grazie per la risposta! È molto più chiaro per me ora. Ti dispiace aggiustare/riformulare la seconda frase? Penso che uno svincolo sia mancante o che io sia troppo novizio per analizzarlo. – forker

Problemi correlati