斯卡拉"匹配"的帮助

Tej*_*eni 11 functional-programming scala

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

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)
    }
Run Code Online (Sandbox Code Playgroud)

Lan*_*dei 28

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

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

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

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

正如您所看到的,我们需要命名第一个和第三个元素,因为我们需要它们来获得右侧相同结构的列表,这是一个样板文件.如果您在右侧需要两者时list,可以将整个事物命名为(),并在结构中更深入部分()更容易和更清晰elem.


Bra*_*ord 8

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

我没有真正看到子列表的目的,因为你可以直接引用ls.

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

  • 它在语言参考中称为"模式绑定器". (10认同)