Я использую Data.Data.Lens.uniplate
, чтобы определить экземпляр Plated
для следующего самоподобного типа.
data Formula a = Atom a
| Conjunction [Formula a]
| If Expr Expr (Formula a) (Formula a)
deriving (Eq, Ord, Read, Show, Data, Typeable)
instance Plated (Formula a) where
plate = uniplate
Когда я вызываю Control.Lens.Plated.transform
для прохождения экземпляра Formula a
, переписывающего лист узлы Atom a
, обход не входит во вторую "остальную" ветвь конструкции If
! Все Formula a
в списке внутри конструктора Conjunction
пройдены, но пройден только первый Formula a
в конструкторе If
.
Я не вижу существенной разницы между этим код и пример в Haddock (https://hackage.haskell.org/package/lens-4.2/docs/Control-Lens-Plated.html#t: покрытие )
Что мне здесь не хватает?