Мне нужен следующий класс функций:
class InterleavedHomomorphic x where
interleaveHomomorphism :: (forall a . f a -> g a) -> x f -> x g
Очевидно, имя, которое я придумал для него, никоим образом не является официальным термином для чего-либо, а класс типа выше не очень изящный. Является ли это концепцией, которая имеет имя или даже реализацию в какой-либо библиотеке? Есть ли еще более разумный способ сделать это?
Цель этой функции состояла бы в том, что у меня есть некоторый контекст f
, который аннотирует некоторые данные (Foo
и Bar
- это просто случайные структуры данных примера для этого вопроса):
data Foo f = One (f (Bar f)) | Product (f (Foo f)) (f (Foo f))
data Bar f = Zero | Succ (f (Bar f))
Я хотел бы преобразовать контекст данных полиморфным образом; только зная гомоморфизм между контекстами, а не (обязательно) заботясь о самих данных. Это можно сделать, предоставив instance InterleavedHomomorphic Foo
и instance InterleavedHomomorphic Bar
в приведенном выше примере.