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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top