当前的SYB是否允许使用新类型扩展泛型函数?

时间:2013-02-12 21:10:58

标签: haskell generic-programming scrap-your-boilerplate

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时需要立即指定所有类型特定的案例?

1 个答案:

答案 0 :(得分:1)

据我所知,在该系统内没有办法解决限制问题。事实上没有必要在第三篇论文中引入新方法。有工作的syb-with-class代码,实现关于hackage的第三篇论文:http://hackage.haskell.org/package/syb-with-class

然而,我最近的建议是尝试尝试新的Generics机制,这种机制更快,更有原则,更灵活(虽然偶尔真的很痛苦 - ))。