これが階段の本のExprクラスです。
abstract class Expr
case class Var(name: String) extends Expr
case class Number(num: Double) extends Expr
case class UnOp(operator: String, arg: Expr) extends Expr
case class BinOp(operator: String, left: Expr, right: Expr) extends Expr
ここで、式の変数の名前を変更する関数が必要です。これが私の最初の試みです。
def renameVar(expr: Expr, varName: String, newName: String): Expr = expr match {
case Var(name) if name == varName => Var(newName)
case Number(_) => expr
case UnOp(operator, arg) => UnOp(operator, renameVar(arg, varName, newName))
case BinOp(operator, left, right) => BinOp(operator, renameVar(left, varName, newName), renameVar(right, varName, newName))
}
val anExpr = BinOp("+", Number(1), Var("x"))
val anExpr2 = renameVar(anExpr, "x", "y")
これは機能しますが、面倒です(私が使用している実際のクラスには、いくつかのケースサブクラスがあります)。また、いくつかの同様の変換が必要になる場合があります。より良い代替案はありますか(おそらく高階関数を使用します)?