包含选项未接收类型的列表上的Scala模式匹配?

时间:2012-05-28 19:46:13

标签: scala pattern-matching

尝试修复客户端API但遇到问题:

case Some(List(Some(msgType:String), Some(channel:String), Some(data:String))) =>
        List(Some(msgType:String), Some(channel:String), Some(data:String)).foreach {
            msgType match {
              case "message" | "pmessage" => 
                fn(M(channel, data))
              case x => throw new RuntimeException("unhandled message: " + x)
            }
        }

当我去编译代码时,我在type mismatch; found : Any required: Some[String] => ?

收到错误fn(M(channel, data))

如何正确构建匹配以便它接收类型?

2 个答案:

答案 0 :(得分:3)

让我们稍微分解一下:

case Some(List(Some(msgType:String), Some(channel:String), Some(data:String))) =>
    List(Some(msgType:String), Some(channel:String), Some(data:String)).foreach {

因此,此时,您必须提供从Option[String]到某事的功能。这是至关重要的一点:您需要将函数作为参数传递给foreach。我们继续吧:

        msgType match {

你可能会觉得这是一个功能 - 但事实并非如此。也许你理解这一点,但是,为了以防万一,让我解释一下这一点。函数接受一个参数并返回其他内容:它可以通过多种方式声明:

x => f(x) // anonymous function
{ case x => f(x) } // pattern-matching anonymous function
f _ // eta expansion of method f
f(_) // partial function application
_ + 1 // anonymous function with placeholder syntax

请注意,msgType match {不属于上述情况。

现在,msgType在这里指的是第一种情况下匹配的内容。对于foreach的每次调用(它将通过msgTypechanneldata进行迭代,它将完全相同,因此,调用传递的函数三次。)< / p>

          case "message" | "pmessage" => 
            fn(M(channel, data))

现在我们到了问题的关键点。 fn(M(channel,data))是将传递给foreach的函数,因此fn的返回类型必须为String => ???。由于您未提供有关fnM的任何信息,因此我们无法评估可能存在的问题。

但是,也许你不打算让fn返回一个函数,并且在foreach上搞砸了。再一次,你没有解释你想要完成什么,所以我无法解释如何实现它。

          case x => throw new RuntimeException("unhandled message: " + x)
        }
    }

答案 1 :(得分:0)

我愿意:

myList match {
  case Some(xs @ List(Some(msgType:String), Some(channel:String), Some(data:String))) =>
    xs.foreach {...}
  case _ => {...}
}

我希望它有所帮助,即使一种更清洁的方式肯定存在。