first two Scrap你的Boilerplate论文描述了一种编写适用于一般类型的通用函数的方法,但针对特定类型有特殊情况。例如,aeson
包中的fromJSON
定义了从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)
...
然而,正如the third SYB paper所指出的那样,“所有类型特定的案例[需要] 当通用函数定义的递归结被束缚时,立即提供“。然后,论文提出了一种通过类型机制解除这种限制的方法。
前两篇SYB论文(经过一些修改)是syb
包的一部分,但第三篇不是。是否有其他方法可以解除限制,即在Hackage上实施SYB时需要立即指定所有类型特定的案例?
答案 0 :(得分:1)
据我所知,在该系统内没有办法解决限制问题。事实上没有必要在第三篇论文中引入新方法。有工作的syb-with-class代码,实现关于hackage的第三篇论文:http://hackage.haskell.org/package/syb-with-class
然而,我最近的建议是尝试尝试新的Generics机制,这种机制更快,更有原则,更灵活(虽然偶尔真的很痛苦 - ))。