Tenho o functor de ponto fixo definido da seguinte forma:
newtype Fix f =
Fix
{ unfix ::
f (Fix f)
}
Gostaria de definir uma função que recebe a Fix f
e fornece sua codificação Böhm-Beraducci. Então, isso deve ter o tipo:
cata :: Fix f -> (forall a. (f a -> a) -> a)
Posso facilmente definir uma função como essa, mas com a restrição adicional que f
é um Functor
, mas estou com dificuldades sem essa restrição.
Intuitivamente, quero pegar o AST e substituir todas as instâncias do Fix
construtor por uma função de entrada, no entanto, na prática, isso parece exigir uma Functor
instância para F
. Mas, no meu entendimento, a codificação Böhm-Beraducci deve existir mesmo quando f
não é um Functor
.
Sinto que estou esquecendo de algo simples aqui. Há alguma definição que estou esquecendo? Se Functor
for realmente necessário, por quê? Quando a codificação Böhm-Beraducci requer restrições adicionais como essa?