1

两篇Scrap Your Boilerplate 论文描述了一种编写通用函数的方法,该函数适用于一般类型,但对特定类型有特殊情况。例如,fromJSONaeson包中,定义了一个用于从 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 时需要同时指定所有特定类型案例的限制?

4

1 回答 1

1

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

然而,我最近的建议是尝试使用新的泛型机制,它更快、更有原则、更灵活(尽管偶尔会很痛苦:-))。

于 2013-02-12T22:03:10.887 回答