无形的通用,类似策略的战略术语重写,强类型的一级多态函数可行吗?

时间:2015-06-07 22:52:08

标签: scala generic-programming shapeless term rewriting

我想找到一种方法来构建一个类似于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. 问候。

这看起来有多可行?

0 个答案:

没有答案