这两种生成序列的方式有什么区别?

时间:2019-06-09 20:37:48

标签: f#

我正在学习F#,到目前为止,有两种生成序列的方法,我很好奇它们之间的差异。

第一种方式:

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

第二种方式:

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

1 个答案:

答案 0 :(得分:4)

两者之间有两个主要区别:

  • 首先,unfold使您可以在步骤之间保持某种状态,而initInfinite仅给您所生成项目的索引,因此您需要一种产生值的方法根据索引。

  • 第二,unfold可以创建有限的序列(通过返回None),而initInfinite仅创建无限的序列(顾名思义)

    < / li>

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来执行此操作-因为您不知道先前的值是什么,并且无法结束序列。