F# 在F中具有顺序展开的顺序缓存#

F# 在F中具有顺序展开的顺序缓存#,f#,seq,unfold,F#,Seq,Unfold,我试图缓存一个无限三角形数字序列的结果 let triCalc n = (n*(n+1))/2 let triNumC = 0 |> Seq.unfold (fun n -> Some((triCalc n, n+1))) |> Seq.cache 然而,当我试图缓存它时,它似乎并不像我期望的那样工作 let x = Seq.take 4 (triNumC) let y = Seq.take 4 (triNumC) printf "%A" x printf "%A" y

我试图缓存一个无限三角形数字序列的结果

let triCalc n = (n*(n+1))/2
let triNumC = 0 |> Seq.unfold (fun n -> Some((triCalc n, n+1))) |> Seq.cache

然而,当我试图缓存它时,它似乎并不像我期望的那样工作

let x = Seq.take 4 (triNumC)
let y = Seq.take 4 (triNumC)

printf "%A" x
printf "%A" y
这张照片

seq [0; 1; 3; 6]seq [0; 1; 3; 6]

我缓存错误了吗?打印的第二个序列不应该是第一个序列的延续吗?我不太确定如何继续。

如果你想继续,你需要跳过。序列保持不变

let y = triNumC
        |> Seq.skip 4
        |> Seq.take 4

缓存很好。缓存的好处是,在计算y时,y是从第五个术语开始的,因为前4个术语已经被缓存。

如果是这种情况,
Seq.take
必须变异
triNumC
,这听起来是个坏主意<代码>缓存将后续枚举与源代码隔离。@Asti好的,我认为这是有意义的。因此,忽略多个Seq.take,缓存是否正确完成?是的,第一个printf将导致
展开
求值,但第二个printf不会求值。默认情况下,表达式是纯的…x和y都等效于同一个表达式,因此您(通常)希望它们相等。