Преимущества SYB (откажитесь от ваших шаблонов) перед GHC Generics
Есть ли какие-либо задачи, которые возможны только с SYB, или намного проще с ним, по сравнению с GHC Generics?
1 ответ
GHC Generics - довольно многословный способ выполнить практически любой запрос или обход. Например, рассмотрим язык AST с Stmt
а также Expr
типы, которые оба получают Typeable
, Generic
, а также Data
:
data Stmt = ... lots of constrs ...
data Expr = Const Int
| ... lots of other constrs ...
Как вы используете SYB, чтобы получить все константы, начиная с любого Expr
или же Stmt
? Что-то вроде:
getConst (Const i) = [i]
getConst _ = []
getAllConst = everything (++) (mkQ getConst)
Сравните это с типичным использованием Generics, требующим двух классов, обходом суммы представлений продуктов и созданием экземпляра класса N раз для N типов, нуждающихся в прохождении. Там, где SYB, да и большинство систем общего назначения, не справляются с работой.