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都等效于同一个表达式,因此您(通常)希望它们相等。