Я не могу понять функцию generateSequence в Kotlin - PullRequest
0 голосов
/ 01 марта 2019

Я сбит с толку 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

1 Ответ

0 голосов
/ 02 марта 2019

Таким образом, может показаться, что тип последовательности - Int, а семя - пара.

Данная функция 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

Если это поможет вам подумать об этом, вы можете представить, что генерируется «вся» первая последовательностьдо того, как какие-либо пары будут преобразованы в целые числа.

И как, черт возьми, функция знает, когда остановиться?

Нет.Но в примере используется функция take() , чтобы обрезать последовательность до первых 10 элементов, а затем распечатать ее вместо печати бесконечной последовательности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...