scala类型不匹配错误与密封特征

时间:2017-12-12 20:02:08

标签: scala parsing

我正在开发我的第一个实现递归下降数学表达式解析器的scala项目。

在任何递归下降解析器中,我都有函数(对应于我的语法程序),它可以返回Success,其余部分要解析,结果或失败。

为此,我在密封特征中使用了两个case类,这样我的函数可以返回一个对应于成功或失败的类型Result,但是我在编译和工作时遇到了麻烦。 (我在比赛中一直收到type mismatch错误)

知道我做错了什么?

这是他的代码:

sealed trait Result
case class Success(expr: String, result: Int) extends Result
case object Failure extends Result

class PackratParser() {
   var x: Int = 3

   def pExpr(expr: String) : Result = {
       return Success(32)
   }

   def parseExpr(expr: String) : Int = {
       val p = pExpr(expr)
       p match {
           case Success(expr, res) => println("success!" + expr + res)
           case Failure => println("failure...")
       }
   }
}

谢谢:)

1 个答案:

答案 0 :(得分:0)

有两个问题。首先,在pExpr内,您只向Success提供一个参数,即使它需要两个:

   def pExpr(expr: String) : Result = {
       return Success(32) // Requires String and Int
   }

其次,parseExpr的返回类型为Int,但您目前没有返回任何内容。这取决于你想要如何处理它,但一个选择是返回Option[Int]而不是Int,因为你不会有Int返回Failure

 def parseExpr(expr: String): Option[Int] = {
    val p = pExpr(expr)
    val maybeInt = p match {
      case Success(expr, res) => {
        println("success!" + expr + res)
        Some(res)
      }
      case Failure => {
        println("failure...")
        None
      }
    }
    maybeInt
  }

工作小提琴here