gpt4 book ai didi

java - 在scala中添加案例类的字段

转载 作者:行者123 更新时间:2023-12-01 09:56:26 25 4
gpt4 key购买 nike

我有以下案例类。表达式是盒装的数学运算和数字。例如add是表达式的子类,它递归地包含两个字段num,num也是表达式的子类。

  abstract class Expression
case class num (num: Int) extends Expression
case class add (left: Expression, right: Expression) extends Expression

abstract class Result
case class numericResult (v : Int) extends Result

还有其他类型的返回,因此我无法删除案例类

Evaluate 方法应该采用表达式,将其拆箱,然后执行操作并返回结果,该结果是 Result 类中的框

def evaluate(expr: Expression ) : Result = {
expr match {
case num(n) => new numericResult(n)
case add(l, r) => new numericResult(evaluate(l).v + evaluate(r).v) //add will never be called on imaginary numbers
case addi(l, r) => new imaginaryResult(...) //adds imaginary numbers

}
}

但是当我尝试评估它时,出现错误:

error: value v is not a member of Result

如何确保 Scala 知道 l 和 r 是 num 类型,并且在求值时会给出 numericResult 而不是 Result?我可以假设,如果 addvalu(l) 和valuate(r) 将返回 numericResut,但 l 和 r 也可能是嵌套的 add。

最佳答案

通过表达式产生的结果类型参数化它们:

abstract class Expression[T <: Result]
case class num (num: Int) extends Expression[numericResult]
case class add (left: Expression[numericResult], right: Expression[numericResult]) extends Expression[numericResult]
case class addi (left: Expression[Result], right: Expression[Result]) extends Expression[imaginaryResult]

abstract class Result
// why lower-case?
case class numericResult (v : Int) extends Result
case class imaginaryResult(v: Int) extends Result

def evaluate [T <: Result](expr: Expression[T] ) : T = {
expr match {
case num(n) => new numericResult(n)
case add(l, r) => new numericResult(evaluate(l).v + evaluate(r).v) //add will never be called on imaginary numbers
case addi(l, r) => new imaginaryResult(???) //adds imaginary numbers
}
}

关于java - 在scala中添加案例类的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37171953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com