我很好奇F#Seq计算表达式如何实现IEnumerable数据结构。
在GitHub上搜索Sharp.Core/seq.fs以获得收益率! (YieldFrom(expr))并不成功。
答案 0 :(得分:6)
正如Daniel引用的规范所说,序列表达式不被视为普通计算表达式 - 而不是将它们转换为构建器方法调用(例如seq.For
,seq.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#库中定义。
接下来将详细说明编译器如何详细阐述序列表达式。