mónada Tranformers y apilado de múltiples mónadas
-
22-09-2019 - |
Pregunta
Tengo f
función con la firma f :: [a] -> StateT Int Reader b [c]
y f'
con la firma f' :: a -> StateT Int Reader b [c]
El cálculo de f (muy simplificado) se parece a lo siguiente:
f [] = return []
f (s:st) = f' s >>= \x ->
f st >>= \y ->
return $ ...
Y en lugar de la ... Me gustaría volver la parte [c]
de x
++
la parte [c]
de y
con el material envuelto alrededor mónada.
¿Existe la posibilidad de lograr que, sin desenvolver manualmente x
y y
y poner manualmente el resultado juntos de nuevo? ¿Necesito una mónada lista en la parte inferior de mi pila mónada para obtener el código simple? El lector mónada no es, obviamente, una instancia de la clase MonadPlus.
Solución
No se obtiene lo que quiere decir con desenvolver x
y y
.
Me tendría la última línea como
return (x ++ y)
¿Me entienden mal lo que quieres?
Otros consejos
También puede definir simplemente
f = fmap concat . mapM f'
(mapM f' xs
produce un valor de tipo m [[c]]
, donde xs :: [a]
y m = StateT Int (Reader b)
, y concatena a continuación fmap concat
las listas de "dentro de la mónada".)
Tanto f' s
y f st
son valores de una mónada, a saber StateT Int Reader b
. Por lo que ya tiene y x :: [c]
y :: [c]
y sólo tiene que return (x ++ y)
escritura, como dijo Dave Hinton.