scala类出错:递归方法printExpr需要结果类型
我在网上收到错误:
case Sum(l,r) => printExpr(l); print("+"); printExpr(r) 错误是:
这段代码看起来不错,我做错了什么? 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 { ... } } 避免明确声明单位. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |