我正在阅读"Functional Programming in Scala"这本书,并且遇到了一个我不完全了解的例子。Scala名称参数的使用
在上严格的章节/懒惰作者描述流的结构,并有这样的代码:
sealed trait Stream[+A]
case object Empty extends Stream[Nothing]
case class Cons[+A](h:() => A, t:() => Stream[A]) extends Stream[A]
object Stream {
def cons[A](hd: => A, tl: => Stream[A]) : Stream[A] = {
lazy val head = hd
lazy val tail = tl
Cons(() => head,() => tail)
}
...
}
我的问题是在智能构造(cons
),它调用构造函数Cons
案例分类。用来通过head
和tail
vals的特定语法对我来说没有意义。为什么不这样调用构造函数:
Cons(head, tail)
据我了解语法使用的是强要2名Function0对象只返回head
和tail
丘壑的创建。这与刚刚通过head
和tail
(没有() =>
前缀)有什么不同,因为Cons
案例类已被定义为无论如何都采用这些参数?这不是多余的吗?或者我错过了什么?
是的。对于那个很抱歉。正如我提到的@Jesper,我应该注意到两个构造函数的区别,并没有。所以'Cons'需要一个明确的Function0和'cons'为你构建一个(在幕后)。什么传递给'Cons'会立即被评估,传递给'cons'的是稍后评估的。是对的吗? – melston 2014-10-30 21:33:54
是的。当你按照价值传递时,它每次读取时都会被重新评估。 – Nate 2015-10-05 22:01:35