我想找到一种方法来构建一个类似于Kiama的库,其中增加了一个强大的重写规则。 (在Kiama eveyrything是一个术语,重写规则是Term => Option [Term]
我知道无形状允许使用幕后的hlists将任意案例类层次结构转换为产品表示的总和。
基于这种通用表示,我想可以相当可行地编写一个遍历组合器的通用库(以策略的方式),用于对由嵌套case classe构成的术语的泛型版本应用重写规则,
我觉得可以使用无形polyN函数来编码可以产生精确类型的多态术语重写规则,但是这些重写规则必须对表示案例类的Hlists进行操作,这可能非常麻烦。使用与模式匹配如何匹配和转换子树相比较
我有一个简单的例子就是这个
sealed abstract trait Expr { type Repr }
sealed abstract trait BoolExpr extends Expr { type Repr = Boolean }
sealed abstract trait IntExpr extends Expr { type Repr = Int }
case class BoolVar(sym: Symbol) extends BoolExpr
case class Not( l: BoolExpr ) extends BoolExpr
case class And( l: BoolExpr, r: IntExpr ) extends BoolExpr
case class Or( l: BoolExpr, r: IntExpr ) extends BoolExpr
case class IntIte( cond: BoolExpr, thenExpr: IntExpr, elseExpr: IntExpr) extends IntExpr
case class IntConst( value: Int ) extends IntExpr
case class IntVar( sym: Symbol ) extends IntExpr
rule1 { case Not(Not(e)) => Some(e) }
rule2 { case IntIte(Not(c), t, e) => Some( IntIte(c, e, t) }
然而,我担心重写规则必须在hlists上表达,因此我会失去简单模式匹配的能力,如上所示。我唯一可以想象的是,在遍历shapeless.Generic结构时,在匹配规则之前将其转换回来并将结果转换回泛型并使用表示为hlist的新术语更新通用结构。
更好的是处理GADT Expr [T]的重写系统,其中T是表达式的类型,重写规则将保留该T. 问候。
这看起来有多可行?