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.

War es hilfreich?

Lösung

Ich verstehe nicht, was Sie mit x und y auszupacken.

würde ich die letzte Zeile wie

haben
return (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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top