我一直在研究F#Seq方法的实施 - https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/seq.fs。
以下是扫描实现的示例:
[<CompiledName("Scan")>]
let scan<'T,'State> f (z:'State) (source : seq<'T>) =
checkNonNull "source" source
let f = OptimizedClosures.FSharpFunc<_,_,_>.Adapt(f)
seq { let zref = ref z
yield !zref
use ie = source.GetEnumerator()
while ie.MoveNext() do
zref := f.Invoke(!zref, ie.Current)
yield !zref }
它获取枚举器,并使用while循环进行迭代(它必须调用MoveNext)。
无法改变它吗?
[<CompiledName("Scan")>]
let scan<'T,'State> f (z:'State) (source : seq<'T>) =
checkNonNull "source" source
let f = OptimizedClosures.FSharpFunc<_,_,_>.Adapt(f)
seq { let zref = ref z
yield !zref
for i in source do
zref := f.Invoke(!zref, i)
yield !zref }
使用for循环。
只是那个编码风格奇怪的人写了那个代码并且没有人改变它吗?