序列表达式构建器的源代码在哪里

时间:2014-07-21 22:20:39

标签: f#

我很好奇F#Seq计算表达式如何实现IEnumerable数据结构。

在GitHub上搜索Sharp.Core/seq.fs以获得收益率! (YieldFrom(expr))并不成功。

2 个答案:

答案 0 :(得分:6)

正如Daniel引用的规范所说,序列表达式不被视为普通计算表达式 - 而不是将它们转换为构建器方法调用(例如seq.Forseq.Yield等),实际上编译器生成特定于序列的代码。这主要是出于性能原因 - 对计算构建器的调用会增加太多开销。

以下是两个相关的指示:

  • GeneratedSequenceBase类型是编译器在编译序列表达式时使用的基类 - 它周围还有其他库代码,由生成的编译代码使用。请参阅the F# library source code here

  • 类型检查器中的TcSequenceExpression方法是进行类型检查的地方。您可以看到编译器遵循的路径与普通计算表达式不同。这是here in the compiler source code

  • 其他相关部分位于ilxgen.fs,编译器在类型检查后实际生成代码 - 您可以通过在源代码中查找GeneratedSequenceBase找到这些位置(但我是不是这方面的专家)

答案 1 :(得分:3)

spec的§6.3.11。它声明:

  

从逻辑上讲,序列表达式可以被认为是具有类型Microsoft.FSharp.Collections.SeqBuilder的构建器的计算表达式....但是,此构建器类型实际上并未在F#库中定义。

接下来将详细说明编译器如何详细阐述序列表达式。