Как могут быть реализованы дыры и контексты для типов с более высоким родом в одноплатной библиотеке стиля линзы?

Андраш Ковач предложил этот вопросв ответ на ответ на предыдущий вопрос.

В одноплатной библиотеке в стиле линз для разных видов* -> * на основе класса

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

аналог класса для видов*

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

Можно ли реализовать аналогиcontexts а такжеholesкоторые оба имеют типUniplate on => on -> [(on, on -> on)] без необходимостиTypeable1?

Понятно, что это можно реализовать в старом стиле библиотеки uniplate, которая использовалаStr представлять структуру данных, возвращая структуру со списком типов дочерних элементов на уровне типов.

Отверстие может быть представлено следующим типом данных, который заменит(on, on -> on) в подписиcontexts а такжеholes

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

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

Тем не менее, неясно, есть ли реализация дляholes который не требуетTypeable1.

Ответы на вопрос(1)

Ваш ответ на вопрос