trasformatori monade e impilamento di più monadi
-
22-09-2019 - |
Domanda
Non ho funzione f
con la firma f :: [a] -> StateT Int Reader b [c]
, e f'
con la firma f' :: a -> StateT Int Reader b [c]
Il calcolo di f (molto semplificato) si presenta così:
f [] = return []
f (s:st) = f' s >>= \x ->
f st >>= \y ->
return $ ...
E al posto del ... vorrei restituire la parte [c]
del x
++
parte [c]
della y
con la roba monade, avvolto intorno.
C'è una possibilità di ottenere che, senza scartare manualmente x
e y
e mettere manualmente il risultato di nuovo insieme? Ho bisogno di una monade elenco in fondo del mio stack monade per ottenere il codice semplice? The Reader Monade non è ovviamente un'istanza della classe MonadPlus.
Soluzione
Non capisco cosa si intende per scartare x
e y
.
Vorrei avere l'ultima riga come
return (x ++ y)
Ho frainteso quello che vuoi?
Altri suggerimenti
Si può anche semplicemente definire
f = fmap concat . mapM f'
(mapM f' xs
produce un valore di tipo m [[c]]
, dove xs :: [a]
e m = StateT Int (Reader b)
, e quindi fmap concat
concatena le liste "dentro la monade".)
Sia f' s
e f st
sono valori in una monade, cioè StateT Int Reader b
. Quindi si dispone già di x :: [c]
e y :: [c]
e non vi resta che scrivere return (x ++ y)
, come ha detto Dave Hinton.