加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala类出错:递归方法printExpr需要结果类型

发布时间:2020-12-16 18:43:41 所属栏目:安全 来源:网络整理
导读:我在网上收到错误: case Sum(l,r) = printExpr(l); print("+"); printExpr(r) 错误是: recursive method printExpr needs result type 这段代码看起来不错,我做错了什么? abstract class Expr { case class Num(n: Int) extends Expr case class Sum(l: E
我在网上收到错误:

case Sum(l,r) => printExpr(l); print("+"); printExpr(r)

错误是:

recursive method printExpr needs result type

这段代码看起来不错,我做错了什么?

abstract class Expr {

  case class Num(n: Int) extends Expr
  case class Sum(l: Expr,r: Expr) extends Expr
  case class Prod(l: Expr,r: Expr) extends Expr

  def evalExpr(e: Expr): Int = e match {
    case Num(n) => n
    case Sum(l,r) => evalExpr(l) + evalExpr(r)
    case Prod(l,r) => evalExpr(l) * evalExpr(r)
  }

  def printExpr(e: Expr) = e match {
    case Num(n) => print(" " + n + " ")
    case Sum(l,r) => printExpr(l); print("+"); printExpr(r)
    case Prod(l,r) => printExpr(l); print("x"); printExpr(r)
  }
}

解决方法

Scala中的递归方法需要明确声明的返回类型,如错误消息所述.

原因是Scala从方法体中使用的类型推断出方法的返回类型.当方法的返回类型影响方法体中使用的类型时(因为它以递归方式调用自身),Scala无法确定它应该为方法分配的类型,因此它要求您在源代码中执行此操作(和evalExpr一样,你明确地说它返回一个Int).

在这种情况下,您希望printExpr具有返回类型Unit,这是没有信息的不感兴趣的值的类型.通常调用返回类型为Unit的方法仅针对其副作用(例如print).

因此,您可以将printExpr的标题行更改为:

def printExpr(e: Expr) : Unit = e match {

或者,Scala有一些语法糖用于声明“程序”.您可以将“过程”视为不返回任何内容,只是执行一些代码,但实际上Scala中的每个方法都会返回一些内容; “procedures”只是返回类型Unit的方法.这样做的语法是在方法的标题之后省略=,但是你必须用花括号括起方法体(即使它是单个表达式,就像你的匹配一样).所以你可以这样做:

def printExpr(e: Expr) {
  e match {
    ...
  }
}

避免明确声明单位.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读