Uno dei problemi con i trasformatori monad che trovo è la necessità di lift
le operazioni nella monade destra. Una singola lift
qui e non là è male, ma a volte ci sono funzioni che assomiglia a questo:Lavorare su stack di trasformatori monad permutati
fun = do
lift a
lift b
c
lift d
lift e
f
Mi piacerebbe essere in grado di scrivere questa funzione così:
fun = monadInvert $ do
a
b
lift c
d
e
lift f
Questo dimezza il numero di lift
s e rende il codice più pulito.
La domanda è: per quale monade è possibile monadInvert
? Come si dovrebbe creare questa funzione?
Punti bonus: definirlo per monad m
che è un'istanza di MonadIO
.
Il titolo di questa domanda parla di permutazioni: in effetti, come possiamo gestire le permutazioni arbitrarie di uno stack monod tranformer?
Dubito fortemente che tu possa (ma forse qualche malvagio trucco può essere usato). Pensare solo ai tipi non mi dà peso. –
Non proprio una soluzione pronta per la pala, ma potresti trovare [questo documento] (http://www.cs.umd.edu/~mwh/papers/monadic.pdf) che vale la pena leggere; dall'astratto: "il nostro algoritmo inserisce i vincoli, le unità e i morfismi monad-to-monad necessari in modo che il tipo di programma controlli" – acfoltzer