¿Cómo se pueden implementar los agujeros y los contextos para los tipos de tipo superior en una biblioteca uniplate de estilo de lente?

András Kovács propuso esta preguntaen respuesta a una respuesta a una pregunta anterior.

En una biblioteca uniplate estilo lente para tipos de tipos* -> * basado en la clase

class Uniplate1 f where
    uniplate1 :: Applicative m => f a -> (forall b. f b -> m (f b)) -> m (f a)

análogo a la clase para tipos de tipo*

class Uniplate on where
    uniplate :: Applicative m => on -> (on -> m on) -> m on

¿Es posible implementar análogos acontexts yholes, que tienen el tipoUniplate on => on -> [(on, on -> on)] sin requerirTypeable1?

Está claro que esto podría implementarse en el estilo antiguo de la biblioteca uniplate que utilizabaStr para representar la estructura de los datos devolviendo una estructura con una lista de nivel de tipo de los tipos de los elementos secundarios.

Un agujero podría estar representado por el siguiente tipo de datos, que reemplazaría(on, on -> on) en las firmas paracontexts yholes

data Hole f a where
    Hole :: f b -> (f b -> f a) -> Hole f a

holes :: Uniplate1 f => f a -> [Hole f a]
...

Sin embargo, no está claro si hay una implementación paraholes que no requiereTypeable1.

Respuestas a la pregunta(1)

Su respuesta a la pregunta