我正在阅读"Scala函数式编程这本书,遇到了一个我不太理解的例子。
在严格/惰性章节中,作者描述了流的构造,并有如下代码:
我有一个问题是关于智能构造函数(
据我理解所使用的语法是强制创建两个Function0对象,它们简单地返回
在严格/惰性章节中,作者描述了流的构造,并有如下代码:
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
值的具体语法对我来说没有意义。为什么不直接像这样调用构造函数:Cons(head, tail)
据我理解所使用的语法是强制创建两个Function0对象,它们简单地返回
head
和tail
值。那么这与仅传递head
和tail
(不带() =>
前缀)有何不同,因为Cons
case类已经定义了按名称获取这些参数?这不是多余的吗?还是我漏掉了什么?
Cons
需要一个显式的Function0,而cons
会为您构建一个(在幕后)。传递给Cons
的内容会立即被评估,而传递给cons
的内容则稍后评估。这样说对吗? - melston() => A
是一个只有单一、空参数列表的函数类型。(Unit) => A
是接收 unit 作为参数的函数类型。()
不是一个有效的类型。 - Feuermurmel()
是Unit
值。因此,() => Int
与Unit => Int
是相同的类型,但稍微更短一些。 - Nate() => Int
和Unit => Int
不是相同的类型:https://scalafiddle.io/sf/7V2DdXv/0。不过无论如何,感谢你修复了答案! :) - Feuermurmel