0

这是一个最小的例子,我可以定义一个函数,通过

def nextInteger(input: Int): Int = input+1

然后我可以将一个惰性整数流定义为

lazy val integers: Stream[Int] = 1 #::  integers map(x=>nextInteger(x))

令我惊讶的是,取这个流的第一个元素是 2 而不是 1

scala> integers
res21: Stream[Int] = Stream(2, ?)

在这个简单的例子中,我可以在整数的定义中使用 0 而不是 1 来实现我想要的结果,但是通常如何设置一个流以使初始值不丢失?就我而言,我正在设置一个迭代算法,并且想知道初始值。

编辑:此外,我从来没有理解导致以下语法失败的设计选择:

scala> (integers take 10 toList) last
res27: Int = 11

scala> integers take 10 toList last
<console>:24: error: not found: value last
              integers take 10 toList last
                                      ^

我发现用括号括起来很麻烦,有没有我不知道的速记?

4

1 回答 1

4

您可能认为它1 #:: integers map(x=>nextInteger(x))被解析为,1 #:: (integers map(x=>nextInteger(x)))而它实际上被解析为(1 #:: integers).map(x=>nextInteger(x)). 添加括号可以解决您的问题:

val integers: Stream[Int] = 1 #:: (integers map nextInteger)

(注意,sincenextInteger只是一个函数,你不需要为它做一个 lambda,而且既然Stream已经是惰性的,那么做integers惰性是不必要的)


至于您的编辑,请查看有关问题的出色答案。简而言之:不,没有简单的方法。问题是,除非您已经知道所涉及的函数的数量,否则对于下一个阅读您的代码的人来说,拥有类似于您建议的工作的东西将是地狱......例如,

myList foo bar baz

如果不检查、 和的myList.foo.bar.baz定义,您可能myList.foo(bar).baz不会知道。Scala 决定消除这种歧义——它总是后者。foobarbaz

于 2016-08-31T19:15:19.330 回答