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.
在这种情况下,子列表成为整个列表的命名变量(_ :: tail).尾巴是列表中的尾巴.我不确定这里是否有'@'的正确名称.
我没有真正看到子列表的目的,因为你可以直接引用ls.
免责声明:我是斯卡拉的新手.我希望我做对了.
| 归档时间: |
|
| 查看次数: |
982 次 |
| 最近记录: |