【问题标题】:scala type mismatch error with sealed trait具有密封特征的scala类型不匹配错误
【发布时间】:2017-12-12 20:02:07
【问题描述】:

我正在开发我的第一个 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...")
       }
   }
}

谢谢:)

【问题讨论】:

  • 请(在涉及错误的任何个问题中)包含错误消息的完整、准确的文本——这将有助于其他人帮助您。

标签: scala parsing


【解决方案1】:

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

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

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

 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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 2017-09-08
    • 2019-04-25
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多