В Идрисе есть несколько магических механизмов для автоматического создания (зависимых) элиминаторов для пользовательских типов. Мне интересно, возможно ли что-то (возможно, менее зависимое) с типами Haskell. Например, данный
data Foo a = No | Yes a | Perhaps (Foo a)
Я хочу сгенерировать
foo :: b -> (a -> b) -> (b -> b) -> Foo a -> b
foo b _ _ No = b
foo _ f _ (Yes a) = f a
foo b f g (Perhaps c) = g (foo b f g x)
Я довольно слабо отношусь к поливарианским функциям и дженерикам, поэтому я мог бы начать с начала работы.