2

j'ai fonction f avec la signature f :: [a] -> StateT Int Reader b [c] et f' avec signature f' :: a -> StateT Int Reader b [c]tranformers monade et l'empilage de plusieurs monades

Le calcul de f (très simplifiée) ressemble à ce que:

f [] = return [] 
f (s:st) = f' s >>= \x -> 
      f st >>= \y -> 
      return $ ... 

Et à la place de le ... Je voudrais retourner le [c] partie de x++ la [c] partie de y avec les choses de monad enroulées autour.
Existe-t-il une possibilité de réaliser cela sans déballer manuellement les x et y et de regrouper manuellement le résultat? Ai-je besoin d'une monade List au bas de ma pile monad pour obtenir un code simple? Le Reader Monad n'est évidemment pas une instance de la classe MonadPlus. Je ne comprends pas ce que vous voulez dire par le déballage x et y

Répondre

3

j'aurais la dernière ligne que

return (x ++ y) 

Est-ce que je comprends mal ce que vous voulez?

+0

oh ouais, vous 're right - thx :) J'ai mélangé le type de la monade sous-jacente et le type de résultat du calcul. – haselhorstk

1

Les deux f' s et f st sont des valeurs dans une monade, à savoir StateT Int Reader b. Donc, vous avez déjà x :: [c] et y :: [c] et vous avez juste besoin d'écrire return (x ++ y), comme l'a dit Dave Hinton.

2

Vous pouvez également définir simplement

f = fmap concat . mapM f' 

(mapM f' xs produit une valeur de type m [[c]], où xs :: [a] et m = StateT Int (Reader b), puis fmap concat concatène les listes "à l'intérieur du monade".)

Questions connexes