Как могут быть реализованы дыры и контексты для типов с более высоким родом в одноплатной библиотеке стиля линзы?
Андраш Ковач предложил этот вопросв ответ на ответ на предыдущий вопрос.
В одноплатной библиотеке в стиле линз для разных видов* -> *
на основе класса
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
.