簡體   English   中英

列表上的案例類和模式匹配

[英]Case Classes and Pattern Matching on List

我想做的是簡化這個表達式

選項(選擇 (ExpList(列表)( 選擇(選擇 (Var(“可選”))))))))

得到這樣的東西

選項 (ExpList(列表( 選項 (Var(“可選”)))))


匹配表達式的內容看起來像是為了簡化列表中的所有表達式。

這些任務的最佳實踐是什么?

我試過的代碼片段是這樣的:

object CaseClassPatternMatching extends App {
  abstract class Expr
  case class Var(name: String) extends Expr
  case class Opt(expr: Expr) extends Expr
  case class ExpList(listExp: List[Expr]) extends Expr

  def joinOpt(feature: Expr): Expr = feature match {
    case Opt(Opt(f)) => joinOpt(Opt(f))    // Opt(Opt("test")) --> Opt("test")
    // case ExpList(list) => ????          // What to do there?
    case _ => feature
  }

  val expr1: Expr = joinOpt(Opt(Opt(Opt(Var("optional")))))
  println(Opt(Var("optional"))) 
  // Output: Opt(Var(optional))  --> That one is OK...

  val expr2: Expr = joinOpt(Opt(Opt(ExpList(List(Opt(Opt(Var("optional"))))))))
  println(expr2)
  // Output: Opt(ExpList(List(Opt(Opt(Var(optional))))))  --> Not OK...
  // How to simplify expressions inside list?
}

[編輯]

對於那些感興趣的人,類似的主題:

Scala案例類,模式匹配和varargs

你需要四個案例:

def joinOpt(feature: Expr): Expr = feature match {
                         // remove extra Opt 
                         // (you can use @ to avoid recreating Opt)
  case Opt(opt @ Opt(_)) => joinOpt(opt) 
                         // preserve single Opt
  case Opt(expr)         => Opt(joinOpt(expr)) 
                         // apply function to all elements in inner list
  case ExpList(list)     => ExpList(list map joinOpt) 
  case _ => feature
}

好吧,我會像這樣寫joinOpt

def joinOpt(feature: Expr): Expr = feature match {
  case Opt(Opt(f))   => joinOpt(Opt(f))    // Opt(Opt("test")) --> Opt("test")
  case ExpList(list) => ExpList(list map joinOpt)
  case other         => other
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM