为什么Fsharp.Core使用GetEnumerator而不是for

时间:2015-06-18 00:21:43

标签: f#

我一直在研究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循环。

只是那个编码风格奇怪的人写了那个代码并且没有人改变它吗?

0 个答案:

没有答案