执行模式匹配时,Scala类型不匹配

时间:2018-07-17 12:12:38

标签: scala pattern-matching

我正在尝试进行符合预期的模式匹配,但是IntelliJ IDE显示以下突出显示错误

Expected: PartialFunction[Regex, NotInferedB], actual: Nothing => Boolean. 
Cannot resolve method x.unapply  
Cannot resolve symbol x

代码:

 scala>  val keys = Map(
         |          "XYZ" -> List("(?i)(.*SANDWICH.*)",
         |            "(?i)(.*BURGER.*)").map(x => x.r)
         |        )

    keys: scala.collection.immutable.Map[String,List[scala.util.matching.Regex]] = Map(XYZ -> List((?i)(.*SANDWICH.*), (?i)(.*BURGER.*)))

    scala> val desc = "I DON't LIKE SANDWICH "
    desc: String = "I DON't LIKE SANDWICH "

    scala> if (keys("XYZ").collect{x => desc match{ case x(key) => true}}.contains(true)) println("yes") else println("no")
    yes

该错误显示在收集部分中。谁能指导我,这可能是导致IntelliJ中突出显示错误的问题

3 个答案:

答案 0 :(得分:1)

获得PartialFunction[Regex, NotInferedB], actual: Nothing => Boolean编译时间的原因是因为您提供了lambda函数,而collect函数却具有PartialFunction。

我不知道您希望通过代码片段实现什么,但是下面的内容可以解决您的问题。

if (keys("XYZ").collect { case x => true }.contains(true)) println("yes") else println("no")

答案 1 :(得分:0)

  • 写上一个表达式的正确方法是:

if (keys("XYZ").collect{case x: Regex => desc match{ case x(_) => true} }.contains(true)) println("yes") else println("no")

  • 但是有一种更好的方式编写它:

    if(keys("XYZ").exists { x => x.findFirstMatchIn(desc) match { case Some(_) => true case None => false } }) println("yes") else println("no")

答案 2 :(得分:0)

尝试一下:

if (keys("XYZ").exists(_.findFirstIn(desc).isDefined)) println("yes") else println("no")