在调试memoization函数时,我发现自己试图找出Seq.mapi
是否实际迭代序列,所以我用printfn
调用替换了匿名函数,如下所示:
let x = "test" |> Seq.map (fun c -> c |> printfn "%c")
令我惊讶的是,打印到控制台的副作用从未发生过,在FSI中它只返回val d : seq<unit>
。虽然这个结果是正确的,但我曾预料到当map
函数迭代序列时会产生副作用。即,当我用Seq.map id
替换它时,它按预期工作并返回自己。
当我将Seq.map
或Seq.mapi
替换为Seq.iter
或Seq.iteri
时,实际上会打印副作用。
现在我认为这是由于序列被延迟评估而且F#内部要么创建一个闭包序列,要么实际上什么都不做,直到它被调用,因为如果我这样做{{ 1}},它 打印序列中的所有项目。