我无法理解 Kotlin 中的 generateSequence 函数

yon*_*oni 3 kotlin

我对generateSequenceKotlin 中的感到困惑。我似乎阅读手册都错了:

这是函数签名(用于generateSequence种子):

fun <T : Any> generateSequence(
    seed: T?, 
    nextFunction: (T) -> T?
): Sequence<T>
Run Code Online (Sandbox Code Playgroud)

所以Sequence应该是相同类型的种子,下一个值也应该是下一个迭代代......

但是男人的例子是:

fun fibonacci(): Sequence<Int> {
    return generateSequence(Pair(0, 1), { Pair(it.second, it.first + it.second) }).map { it.first }
}
?
println(fibonacci().take(10).toList()) // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
Run Code Online (Sandbox Code Playgroud)

所以看起来SequenceisInt的类型是种子 is Pair<Int, Int>

生成器函数映射Pair<Int, Int>TO Int。下一个值如何发送到生成器,下一个Pair<Int, Int>构造在哪里(生成器的输出是Int...)?

这个函数到底是怎么知道什么时候停止的?生成器永不返回null

Ben*_* P. 5

所以看起来序列的类型是 Int 种子是 Pair。

给定的fibonacci()函数用于generateSequence()生成 的序列Pair,然后使用该map函数将该序列转换为 的序列Int

val pairs = generateSequence(Pair(0, 1), { Pair(it.second, it.first + it.second) })
// (0,1), (1,1), (1,2), (2,3), (3,5), (5,8) ...

val ints = pairs.map { it.first }
// 0, 1, 1, 2, 3, 5
Run Code Online (Sandbox Code Playgroud)

如果它帮助您思考,您可以想象“整个”第一个序列是在任何对转换为整数之前生成的。

这个函数到底是怎么知道什么时候停止的?

它没有。但是该示例使用take()函数将序列截断为前 10 项,然后打印该序列而不是打印无限序列。

顺序是lazy; 它仅在需要时生成值(通过调用给定的生成器函数)。所以当generateSequence()返回时,它还没有生成任何东西——只是创建了一个可以这样做的序列。类似地,当应用于序列时,map()调用不会立即映射任何值,只是返回一个修改后的序列,如果/当生成任何值时,它会这样做。只有在take()被调用时,序列才会生成(并映射)一些值;并且因为 take() 在 10 个项目后停止,所以它不会产生更多。

  • 顺序是_lazy_;它仅在需要时生成值(通过调用给定的生成器函数)。所以当`generateSequence()`返回时,它还没有生成任何东西——只是创建了一个_可以_这样做的序列。类似地,当应用于一个序列时,`map()` 调用不会立即映射任何值,只是返回一个修改后的序列,如果/当生成任何值时_将_这样做。只有当 `take()` 被调用时,序列才会生成(并映射)一些值;并且因为 `take()` 在 10 个项目后停止,所以它不会产生更多。 (2认同)