Между ними есть два ключевых различия:
Во-первых, unfold
позволяет вам сохранять некоторое состояние между шагами, в то время как initInfinite
дает вам только индекс элемента, который выгенерируются, поэтому у вас должен быть способ создания значения на основе индекса.
Во-вторых, unfold
позволяет создавать конечные последовательности (возвращая None
)в то время как initInfinite
создает только бесконечные последовательности (как следует из названия)
Функция unfold
является более общей, чем initInfinite
.Чтобы увидеть это, мы можем легко реализовать initInfinite
, используя unfold
:
let initInfinite f =
Seq.unfold (fun n -> Some(f n, n + 1)) 0
В другом направлении, следующий пример с использованием unfold
создает последовательность, в которой каждый элемент больше предыдущего накакое-то случайное число.Он заканчивается, когда число становится больше 100:
let rnd = System.Random()
Seq.unfold (fun last ->
let next = last + rnd.Next(10)
if last + next > 100 then None
else Some(last + next, last + next) ) 0
Вы не можете сделать это, используя initInfinite
- потому что вы не знаете, какое было предыдущее значение, и вы не можете закончить последовательность.