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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top