Monade Trafos und Stapeln mehrerer Monaden
-
22-09-2019 - |
Frage
Ich habe Funktion f
mit Unterschrift f :: [a] -> StateT Int Reader b [c]
und f'
mit Unterschrift f' :: a -> StateT Int Reader b [c]
Die Berechnung in f (sehr vereinfacht) sieht wie folgt aus:
f [] = return []
f (s:st) = f' s >>= \x ->
f st >>= \y ->
return $ ...
Und anstelle der ... Ich möchte den [c]
Teil x
++
zurückzukehren der [c]
Teil y
mit der Monade Sachen herumgewickelt.
Gibt es eine Möglichkeit, das zu erreichen, ohne manuell x
und y
auszupacken und manuell das Ergebnis wieder zusammensetzen? Brauche ich eine Liste Monade an der Unterseite meines Monade Stapel einfachen Code zu bekommen? Der Reader Monade ist offensichtlich nicht eine Instanz der Klasse MonadPlus.
Lösung
Ich verstehe nicht, was Sie mit x
und y
auszupacken.
würde ich die letzte Zeile wie
habenreturn (x ++ y)
Muss ich falsch verstehen, was Sie wollen?
Andere Tipps
Sie können auch einfach definieren
f = fmap concat . mapM f'
(mapM f' xs
erzeugt einen Wert vom Typ m [[c]]
, wo xs :: [a]
und m = StateT Int (Reader b)
und dann fmap concat
verkettet die Listen "innerhalb des monadisch".)
Sowohl f' s
und f st
sind Werte in einer Monade, nämlich StateT Int Reader b
. So können Sie bereits x :: [c]
und y :: [c]
haben und einfach zu schreiben return (x ++ y)
benötigen, wie Dave Hinton sagte.