【问题标题】:Scala "match" helpScala“匹配”帮助
【发布时间】:2010-12-25 14:55:23
【问题描述】:

我正在研究一些 scala 代码,发现这种方法让我感到困惑。在 match 语句中,sublist@ 构造是什么?它包含什么样的价值?当我打印它时,它与tail 没有差异,但如果我用尾巴替换它,该函数将返回差异结果。有人可以解释它是什么并指出我正确的资源来理解它吗? (我知道我可以在 google 中搜索,但不知道要查找什么......)

def flatMapSublists[A, B](ls: List[A])(f: (List[A]) => List[B]): List[B] =
    ls match {
      case Nil => Nil
      case sublist@(_ :: tail) => f(sublist) ::: flatMapSublists(tail)(f)
    }

【问题讨论】:

  • @ 通常用于注释中,但我在这里看不到类似的东西......

标签: scala functional-programming


【解决方案1】:

我会称之为“吃你的蛋糕,也有它的运营商”。在模式匹配的任何级别,您都可以为部分命名(在@ 之前)并进一步解构它(在@ 之后)。例如,假设您想匹配一个包含 3 个元素的列表,您需要第二个元素,但您想记录整个列表:

something match {
  case list@List(_,elem,_) => log("matching:" + list); elem    
  case _ => error("not found")
}   

如果没有这个功能,你必须写类似的东西

something match {
  case List(a,elem,b) => log("matching:" + List(a,elem,b)); elem    
  case _ => error("not found")
}   

如您所见,我们需要命名第一个和第三个元素,只是因为我们需要它们在右侧获取具有相同结构的列表,即样板。如果您可以为整个事物命名 (list) 以及结构中更深的部分 (elem),那么当您需要在右侧同时命名两者时,它会更容易和更清晰。

【讨论】:

    【解决方案2】:

    在这种情况下,子列表成为整个列表(_ :: tail) 的命名变量。 tail 是列表的尾部。我不确定这里是否有“@”的正确名称。

    这里我并没有真正看到子列表的目的,因为您可以直接引用ls

    免责声明:我是 scala 的新手。我希望我做对了。

    【讨论】:

    • 在 Haskell(可能是 ML)中也是如此。
    • 您好,谢谢您的回答。这两个答案都帮助我理解了它。
    • 在语言参考中被称为“模式活页夹”。
    • +1 表示我不需要在这里使用它,我可以改用ls
    猜你喜欢
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多