SYB(废弃样板)优于GHC Generics的优点

Pet*_*lák 8 haskell scrap-your-boilerplate ghc-generics

与GHC Generics相比,是否只有SYB可以完成任务,或者使用它更容易?

Tho*_*son 3

GHC 泛型是一种相当冗长的方法,用于执行基本上任何查询或遍历。例如,考虑一种语言 AST,其StmtExpr类型均派生TypeableGenericData

data Stmt = ... lots of constrs ...
data Expr = Const Int
          | ... lots of other constrs ...
Run Code Online (Sandbox Code Playgroud)

如何利用 SYB 获取从Expror开始的所有常量Stmt?就像是:

getConst (Const i) = [i]
getConst _         = []

getAllConst = everything (++) (mkQ getConst)
Run Code Online (Sandbox Code Playgroud)

将此与需要两个类的泛型的典型使用进行对比,遍历乘积表示的总和,并为需要遍历的 N 类型实例化该类 N 次。SYB 以及大多数通用系统在性能方面表现不佳。