У меня есть некоторый GADT, который представляет термин в лямбда-исчислении.
data Term a =
Var a
| Lambda a (Term a)
| Apply (Term a) (Term a)
Я хочу сделать следующее: иметь общий интерфейс для преобразования этого типа. Он должен иметь сигнатуру типа, подобную этой:
(Term a -> Term a) -> Term a -> Term a
Эту функцию легко написать:
fmap' :: (Term a → Term a) → Term a → Term a
fmap' f (Var v) = f (Var v)
fmap' f (Lambda v t) = Lambda v (fmap' f t)
fmap' f (Apply t1 t2) = Apply (fmap' f t1) (fmap' f t2)
Итак, мой вопрос, есть ли какая-то общая структура в haskell (или библиотеке haskell) для выполнения такого рода преобразований (аналогичных Функтор
, его, вероятно, следует называть морфизмом)?