다음은 계단 책의 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")
이 작업은하지만 지루합니다 (실제 클래스는 몇 가지 사례 하위 클래스가 있습니다). 또한 몇 가지 유사한 변형이 필요할 수 있습니다. 거기에 더 나은 대안 (가능성이 높은 순서 기능을 사용하여)?
감사합니다. 이 작품. 이것은 더 추상화 될 수 있습니까 (예 : 형질에서 필요에 따라 언제든지 특성을 혼합 할 수 있습니다.) 구현은 내성에 의해 처리 될만큼 일반적으로 보입니다. – dips
@dips,이 패턴을 취할 수있는 방법은 다양합니다. 요구 사항이 무엇이고 어디에서 모든 부품을 정의 할 것인가에 달려 있습니다. 정확히 무엇을하고 싶은지 알지 못하면 구체적인 조언을하기가 어렵지만이를 더 이상 탐구하기위한 출발점으로 사용할 수 있습니다. – dhg