我正在学习F#,到目前为止,有两种生成序列的方法,我很好奇它们之间的差异。
第一种方式:
Seq.unfold(fun x -> Some(x, x + 1)) 1 |> printfn "%A"
第二种方式:
Seq.initInfinite (fun x -> x + 1) |> printfn "%A"
答案 0 :(得分:4)
两者之间有两个主要区别:
首先,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
来执行此操作-因为您不知道先前的值是什么,并且无法结束序列。