1

我正在尝试缓存无限序列的三角形数字的结果。

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]

我缓存不正确吗?打印的第二个序列不应该是第一个序列的延续吗?我不太确定如何进步。

4

1 回答 1

1

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

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

缓存很好。缓存的好处是,当计算y时,从第 5 项开始,因为前 4 项已经缓存。

于 2020-05-24T14:32:50.710 回答