Как использовать церковное кодирование для свободных монад?

Я используюFree тип данных вControl.Monad.Free отfree пакет. Сейчас я пытаюсь преобразовать его в использованиеF вControl.Monad.Free.Church но не могу понять, как отобразить функции.

Например, простая функция сопоставления с образцом, использующаяFree будет выглядеть так -

-- 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

Я могу легко преобразовать его в функцию, которая используетF путем преобразования в / изFree -

-- 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)

Однако я не могу понять, как это сделать без использованияtoF а такжеfromF -

-- 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

Должна быть общая схема, по которой я скучаю. Можете ли вы помочь мне разобраться?

Ответы на вопрос(4)

Ваш ответ на вопрос