Wie verwende ich die Church-Codierung für freie Monaden?
Ich benutze dasFree
Datentyp inControl.Monad.Free
von demfree
package. Jetzt versuche ich es zu konvertieren, um @ zu verwendF
imControl.Monad.Free.Church
, kann aber nicht herausfinden, wie die Funktionen zugeordnet werden.
Zum Beispiel eine einfache Mustervergleichsfunktion mitFree
würde so aussehen -
-- Pattern match Free
matchFree
:: (a -> r)
-> (f (Free f a) -> r)
-> Free f a
-> r
matchFree kp _ (Pure a) = kp a
matchFree _ kf (Free f) = kf f
Ich kann es leicht in eine Funktion konvertieren, die @ verwendF
durch Konvertieren nach / vonFree
-
-- Pattern match F (using toF and fromF)
matchF
:: Functor f
=> (a -> r)
-> (f (F f a) -> r)
-> F f a
-> r
matchF kp kf = matchF' . fromF
where
matchF' (Pure a) = kp a
matchF' (Free f) = kf (fmap toF f)
Aber ich kann nicht herausfinden, wie ich es schaffen kann, ohne @ zu verwendtoF
undfromF
-
-- Pattern match F (without using toF)???
-- Doesn't compile
matchF
:: Functor f
=> (a -> r)
-> (f (F f a) -> r)
-> F f a
-> r
matchF kp kf f = f kp kf
Es muss ein allgemeines Muster geben, das mir fehlt. Können Sie mir helfen, es herauszufinden?