¿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
.