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

scala – 使用case类显示表达式

发布时间:2020-12-16 19:05:50 所属栏目:安全 来源:网络整理
导读:我试图实现Martin Odersky的CourseRa Scala课程中显示的示例,尝试使用适当的括号显示持有Sums / Prods的表达式.我提出了以下解决方案: package expressionstrait Expr { def eval : Int = { this match { case Number(n) = n case Sum(e1,e2) = e1.eval + e
我试图实现Martin Odersky的CourseRa Scala课程中显示的示例,尝试使用适当的括号显示持有Sums / Prods的表达式.我提出了以下解决方案:

package expressions

trait Expr {
    def eval : Int = {
      this match {
        case Number(n) => n
        case Sum(e1,e2) => e1.eval + e2.eval
      }
    }
    //def show( exp : Expr) : String
}

case class Number(n:Int) extends Expr
case class Sum(e1: Expr,e2: Expr) extends Expr
case class Prod(e1 : Expr,e2 : Expr) extends Expr
case class Var(x:Char) extends Expr

object testExpr {
  def show(exp : Expr) : String = {
    exp match {
      case Number(x) => x.toString()
      case Sum(e1,e2) => show(e1) + "+" + show(e2)
      case Prod(e1,e2) => 
        val st1 = e1 match {
          case Sum(a,b) => "(" + show(Sum(a,b)) + ")"
          case _ => show(e1)
        }
        val st2 = e2 match {
          case Sum(a,b)) + ")"
          case _ => show(e2)
        }
        st1 + "*" + st2
      case Var(x) => x.toString
    }
  }
}

object test extends App{

  println(testExpr.show(Sum(Number(1),Number(2))))
  println(Sum(Number(1),Number(3)).eval)
  println(testExpr.show(Sum(Number(2),Prod(Number(10),Var('x')))))

  println(testExpr.show(Sum(Prod(Number(2),Var('x')),Var('y'))))
  println(testExpr.show(Prod(Sum(Number(2),Sum(Number(3),Var('y')))))
}

我决定放括号的方式绝对不是最好的解决方案.任何人都可以提出更好的解决方案来实现同样的目

感谢致敬,
Paromita

解决方法

你实际上非常接近.我提出的代码如下:

case Variable(name) => name

case Product(e1,e2) => "%s * %s".format(
  e1 match {
    case Sum(_,_) => "(%s)".format(show(e1))
    case _ => show(e1)
  },e2 match {
    case Sum(_,_) => "(%s)".format(show(e2))
    case _ => show(e2)
  }
)

将使用元组匹配进一步重写

case Product(e1,e2) =>
  val format = (e1,e2) match {
    case (Sum(_,_),_) => "(%s) * %s"
    case (_,Sum(_,_)) => "%s * (%s)"
    case (_,_) => "%s * %s"
  }
  format.format(show(e1),show(e2))

(编辑:李大同)

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

    推荐文章
      热点阅读