Есть ли морфизмы в Haskell?

У меня есть некоторый 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) для выполнения такого рода преобразований (аналогичных Функтор , его, вероятно, следует называть морфизмом)?

6
задан Dan Burton 15 August 2011 в 05:15
поделиться