Scala:无法匹配该模式

Scala:无法匹配该模式,scala,pattern-matching,fold,foldleft,Scala,Pattern Matching,Fold,Foldleft,我是Scala新手,正在尝试在Scala中执行=以下代码: scala> case class FoldExp(firstname : String, lname : String, age : Int, sex : String) 定义类FoldExp scala> object Foo{ | def apply(firstname : String, lname : String, age : Int, sex : String) = new FoldExp(firstnam

我是Scala新手,正在尝试在Scala中执行=以下代码:

scala> case class FoldExp(firstname : String, lname : String, age : Int, sex : String)
定义类FoldExp

scala> object Foo{
 | def apply(firstname : String, lname : String, age : Int, sex : String) = new FoldExp(firstname,lname,age,sex)
 | }
定义对象Foo

scala> val foldList = List(Foo("Hugh", "Jass", 25, "male"),Foo("Biggus"," Dickus", 43, "male"),Foo("Incontinentia", "Buttocks", 37, "female"))
foldList:List[FoldExp]=List(FoldExp(休,贾斯,25岁,男性),FoldExp(比格斯,迪库斯,43岁,男性),FoldExp(失禁,臀部,37岁,女性))

上述代码块引发了以下错误:

<console>:11: error: not found: value foldList
   val secTry = foldList.foldLeft(List[String]()){(w,f) =>
                ^
<console>:13: error: not found: value ==
              case (f.age == 25) => "Band A"
                          ^
<console>:14: error: not found: value >
              case (f.age > 30) => "Band B"
                          ^
<console>:15: error: not found: value >
              case (f.age > 50) => "Band D"
:11:错误:未找到:值折叠列表
val secTry=foldList.foldLeft(List[String]()){(w,f)=>
^
:13:错误:未找到:值==
案例(f.age==25)=>“A波段”
^
:14:错误:未找到:值>
案例(f.age>30)=>“B组”
^
:15:错误:未找到:值>
案例(f.age>50)=>“D组”

我想根据年龄将列表中的人分为不同的类别。但我无法通过模式匹配来实现这一点。有人能告诉我为什么上述方法是错误的,以及实现我的目标需要遵循的方法吗?任何试图解决上述问题的尝试都将受到感谢。提前感谢

您的模式匹配不正确,您将条件作为案例,而不是一个值,然后是一个条件。案例类的功能是(在许多其他功能中),您可以使用易于阅读的语法对其进行模式匹配:

我做了一些测试,如下所示工作正常(检查默认情况)


不能将表达式直接放在case子句中。类似的操作应该可以:

 val comment = f.age match {
     case 25 => "Band A"
     case a if a > 50 => "Band D"
     case a if a > 30 => "Band B"

 }
请注意,我交换了
>30
>50
两种情况,因为匹配语句是按顺序计算的,一旦找到第一个匹配项,计算就会停止。因此,如果
a>30
出现在
a>50
之前,那么后者将永远不会被执行,因为匹配它的所有内容都将与前一个也是


还要注意的是,如果年龄小于25岁或介于26和29岁之间,这将抛出一个
MatchError
。为了避免这种情况,您需要在末尾使用一个默认的“catch all”大小写,例如
case\uU9=>“Unknown band”

因为没有
折叠列表
很抱歉,我在发布时错过了它。我已经定义了折叠列表。结果仍然是一样的。当然,它不是“相同的”:它不会告诉你再也找不到
折叠列表
,是吗?没有任何东西会进入D区,因为任何值>30都会进入B区(案例陈述按顺序进行评估)。此外,没有默认案例。25岁进入A组,大于30岁进入B组,以及任何其他值(20、21、22、23、24、26、27、28、29、30等)将没有匹配带,并将导致
MatchError
异常。此外,当您仅查看年龄时,为什么要在整个案例类上匹配?关于带d,您是对的。我编辑了我的答案以修复该问题。关于默认案例,我刚刚翻译了问题的逻辑。
 val foldList = List(Foo("William", "Shakespeare", 40, "M"), Foo("Rudyard", "Kipling", 25, "M"))

  val secTry = foldList.foldLeft(List[String]()){(w,f) =>
    val comment = f match{
      case FoldExp(_, _, a, _) if a == 25 => "Band A"
      case FoldExp(_, _, a, _) if a > 50 => "Band D"
      case FoldExp(_, _, a, _) if a > 30 => "Band B"
      case _ => "Band Default"

    }
    w:+ s"${f.firstname},${f.age} $comment"
 val comment = f.age match {
     case 25 => "Band A"
     case a if a > 50 => "Band D"
     case a if a > 30 => "Band B"

 }