斯卡拉“匹配”的帮助

时间:2010-12-22 20:24:36

标签: scala functional-programming

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

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)
    }

2 个答案:

答案 0 :(得分:28)

我称之为“吃你的蛋糕,让它也是操作员”。在模式匹配的任何级别,您可以为部件命名(在@之前)并进一步解构(在@之后)。例如,想象你想要匹配一个包含3个元素的List,你需要第二个元素,但是你想记录整个列表:

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),那么当你需要在右侧时,这将更容易和更清晰。

答案 1 :(得分:8)

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

我在这里看不到子列表的用途,因为您可以直接引用ls

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