Разрешает ли текущий SYB расширение обобщенных функций новыми типами?
Первые две статьи Scrap Your Boilerplate описывают способ написания универсальных функций, которые работают для общих типов, но имеют особые случаи для конкретных типов. Например, fromJSON
от aeson
пакет, определяет универсальную функцию для преобразования из JSON, но предоставляет специальные случаи для типов, таких как список или Int
:
parseJSON :: (Data a) => Value -> Parser a
parseJSON j = parseJSON_generic j
`ext1R` list
`ext1R` vector
`ext2R'` mapAny
`ext2R'` hashMapAny
-- Use the standard encoding for all base types.
`extR` (value :: F Integer)
`extR` (value :: F Int)
...
Однако, как отмечается в третьей статье SYB, "все специфичные для типа случаи [необходимо] указывать сразу, когда связан рекурсивный узел определения универсальной функции". Затем в статье предлагается способ снять это ограничение с помощью механизма классов типов.
Первые две статьи SYB являются (с некоторыми изменениями) частью syb
пакет, но третий нет. Есть ли какой-то другой способ снять ограничение, что все специфичные для типа случаи должны быть указаны одновременно с реализацией SYB на Hackage?
1 ответ
Насколько я знаю, в этой системе нет никаких ограничений. Тот факт, что его нет, требует введения нового подхода в третьей статье. Там работает код syb-with-class, реализующий третий документ по взлому: http://hackage.haskell.org/package/syb-with-class
Тем не менее, я рекомендую в эти дни попытаться поэкспериментировать с новым механизмом Generics, который является более быстрым, более принципиальным и более гибким (хотя иногда и реальная боль:-)).