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?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage