В чем разница между этими двумя способами генерации последовательностей? - PullRequest
0 голосов
/ 09 июня 2019

Я изучаю F #, и есть 2 способа генерирования последовательностей, с которыми я до сих пор сталкивался, и мне любопытно узнать о различиях между ними, если таковые имеются.

Первый способ:

Seq.unfold(fun x -> Some(x, x + 1)) 1 |> printfn "%A"

Второй способ:

Seq.initInfinite (fun x -> x + 1) |> printfn "%A"

1 Ответ

4 голосов
/ 10 июня 2019

Между ними есть два ключевых различия:

  • Во-первых, 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 - потому что вы не знаете, какое было предыдущее значение, и вы не можете закончить последовательность.

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