gpt4 book ai didi

scala - 列表中的案例类和模式匹配

转载 作者:行者123 更新时间:2023-12-04 17:53:32 26 4
gpt4 key购买 nike

我想做的是简化这个表达式

Opt(Opt (ExpList(List( Opt(Opt (Var("optional")))))))

得到这样的东西

选项 (ExpList(List( Opt (Var("optional")))))

为了简化列表中的所有表达式,匹配表达式会是什么样子。

此类任务的最佳实践是什么?

我试过的代码片段是这样的:

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 case classes, pattern matching and 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
}

关于scala - 列表中的案例类和模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9186135/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com