Jednym z problemów z transformatorami monady, które znajduję, jest potrzeba wykonania operacji w prawej monadzie. Pojedyncza lift
tu i tam nie jest złe, ale czasami są funkcje, które wygląda następująco:Praca na permutowanym stosie transformatora monadowego
fun = do
lift a
lift b
c
lift d
lift e
f
Chciałbym móc napisać tę funkcję w następujący sposób:
fun = monadInvert $ do
a
b
lift c
d
e
lift f
To o połowę numer lift
s i sprawia, że kod jest czystszy.
Pytanie brzmi: w przypadku jakich monad jest możliwa monadInvert
? Jak utworzyć tę funkcję?
Dodatkowe punkty: zdefiniuj dla monad m
, która jest instancją MonadIO
.
Tytuł tego pytania mówi o permutacjach: w rzeczy samej, jak radzić sobie z dowolnymi permutacjami stosu monad transformatora?
Bardzo wątpię, że możesz (ale być może uda ci się użyć jakiegoś złego oszustwa). Myślenie o typach po prostu mi nie pasuje. –
Naprawdę nie jest to rozwiązanie gotowe do łopaty, ale możesz przeczytać [ten artykuł] (http://www.cs.umd.edu/~mwh/papers/monadic.pdf) warty przeczytania; od abstrakcji: "nasz algorytm wstawia niezbędne wiązania, jednostki i morfizmy monad do monady, tak aby typ programu sprawdzał" – acfoltzer