前 两篇Scrap Your Boilerplate 论文描述了一种编写通用函数的方法,该函数适用于一般类型,但对特定类型有特殊情况。例如,fromJSON
在aeson
包中,定义了一个用于从 JSON 转换的通用函数,但为 list 或 等类型提供了特殊情况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
包的一部分,但第三篇不是。是否有其他方法可以解除在 Hackage 上实施 SYB 时需要同时指定所有特定类型案例的限制?