Я сбит с толку generateSequence
в Котлине.Кажется, я неправильно читаю руководство:
Это сигнатура функции (для generateSequence
с семенами):
fun <T : Any> generateSequence(
seed: T?,
nextFunction: (T) -> T?
): Sequence<T>
Так что 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]
Так что может показаться, что типSequence
равно Int
начальное значение равно Pair<Int, Int>
.
Функция генератора отображает Pair<Int, Int>
TO Int
.Как следующее значение отправляется в генератор, где строится следующий Pair<Int, Int>
(выход генератора равен Int
...)?
И как функция узнает, когда остановиться?Генератор никогда не возвращается null