3

我想找到一种方法来构建一个类似于 Kiama 的库,该库具有一个附加功能,即具有强类型的重写规则。(在 Kiama 中,一切都是 Term,重写规则是 Term => Option[Term]

我知道 shapeless 允许在幕后使用 hlist 将任意案例类层次结构转换为产品表示的总和。

基于这种通用表示,我想编写一个遍历组合子的通用库(以战略风格)用于在由嵌套案例类构成的术语的通用版本上应用重写规则是相当可行的,

我有一种感觉,可以使用无形的 polyN 函数来编码多态术语重写规则,从而产生精确的类型,但是这些重写规则必须在表示案例类的 Hlist 上进行操作,与模式匹配如何允许匹配和转换子树

我有一个简单的例子是这个

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) }

但是,我担心重写规则必须在 hlist 上表达,因此我会失去简单模式匹配的功能,如上图所示。我唯一能想到的是,在遍历 shapeless.Generic 结构时,在匹配规则之前将其转换回位,并将结果转换回泛型,并使用表示为 hlist 的新术语更新泛型结构。

更好的是在 GADT Expr[T] 上工作的重写系统,其中 T 是表达式的类型,重写规则将保留该 T。问候。

这在你看来有多可行?

4

0 回答 0