我应该如何在Scala中使用#::/hash冒号?

Jon*_*Jon 5 scala pattern-matching scala-collections

在关于Fibonacci数字创建的Stackoverflow帖子中,我找到了方法#::(在Scala中编写Fibonacci函数的最快方法是什么?).在ScalaDocs中,我发现此条目(参见此处,1)将哈希冒号冒号方法描述为允许使用#::来匹配流的提取器.

我意识到我可以像这样使用斐波那契函数

def fibonacci: Stream[Long] = {
    def tail(h: Long, n: Long): Stream[Long] = h #:: tail(n, h + n)
    tail(0, 1)
}
fibonacci(10)       //res4: Long = 55
Run Code Online (Sandbox Code Playgroud)
  • 我应该如何理解ScalaDocs的解释?你能举一个例子吗?

  • 为什么没有必要在fibonacci上面的函数中定义参数?

Ale*_*rev 4

该方法#::是为 Streams 定义的。它与列表的方法类似::。List 和 Stream 之间的主要区别在于 Stream 的元素是惰性计算的。

最后一行发生了一些 scala 魔法。实际上,首先您要计算表达式fibonacci,它返回一个Stream对象。该流的第一个和第二个元素是 0 和 1,如示例的第三行所示,流的其余部分是通过递归调用定义的。然后,您从流中提取第十个元素,其计算结果为 55。

在下面的代码中,我展示了对第四个列表元素的类似访问

val list = List(1,2,3,4,5)
println(list(3)) // prints 4
Run Code Online (Sandbox Code Playgroud)

简而言之,将流视为无限列表。您可以在此处找到有关 Stream 的更多信息http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.Stream