Scala 类型不匹配

标签 scala parsing

我对 scala 相当陌生,我正在做我的作业。 这是我正在使用的代码:

case EqNumC(l,r)  => (interp(l),interp(r)) match{
      case (NumV(s),NumV(x)) => if(s == x) BoolV(true) else BoolV(false)
      case _ => throw InterpException("Value not found!")
    }

当我运行此代码时,它工作正常并且我得到了正确的结果。然而,这在某种程度上是错误的。我决定通过这样做来让它变得更好:

case EqNumC(l,r)  => (interp(l),interp(r)) match{
      case (NumV(s),NumV(x)) => if(s==x) BoolV(true)
      case (NumV(_),NumV(_)) => BoolV(false)
      case _ => throw InterpException("Value not found!")
    }

但是,当我运行此命令时,我收到此错误:

Status: CompilationFailure
solution.scala:129: error: type mismatch;
 found   : Unit
 required: Value
      case (NumV(s),NumV(x)) => if(s==x) BoolV(true)
                                ^

我在这里没有看到问题,因为它与另一个问题几乎相同。我怎样才能摆脱这个问题?完成这个任务的最佳方法是什么?

最佳答案

模式匹配时,if 控制结构需要位于 => 之前。当它出现后,编译器会看到一个没有 elseif 并推断它是 Unit(无返回类型)。

它应该看起来像这样:

case (NumV(s),NumV(x)) if(s == x) => BoolV(true)

第一个版本可以工作,因为 if/else 返回一个值,但单个 if 则不能。

关于Scala 类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28612590/

相关文章:

scala - 使用Scala案例类进行建模

scala - 将列表 [Int] 映射到字符

php - 从 twitpic url 下载照片

parsing - 如何使用 PetitParser 解析以关键字开头的标识符?

c++ - 消除 spirit x3 解析器规则中的左递归

c# - 改进/修复 C 样式 block 注释的正则表达式

python - 网站列表解析器只检索20个项目,如何让网站加载更多

scala - 这是什么 Scala 'new' 语法

performance - 使用加特林将条件放入 HTTP 请求中

scala - 什么时候在 Spark 中使用 Kryo 序列化?