Как использовать церковное кодирование для свободных монад?
Я использую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
Должна быть общая схема, по которой я скучаю. Можете ли вы помочь мне разобраться?