通过F# 4.0 spec阅读,我在PDF的第79页看到了以下内容:
如果最里面的ForEach来自用户代码而不是翻译生成,辅助函数
src(e)
表示b.Source(e)
,而构建器b
包含Source
方法。否则,src(e)
表示e
。
这是在规范详细(非常详细)描述如何解析计算表达式并将其转换为表达式构建器对象上的一系列方法调用的上下文中。 Scott Wlaschin's Computation Expressions series,我发现在帮助我理解计算表达式背后的其他概念方面是非常宝贵的,没有提到Source
方法,也没有提到我能找到的任何其他参考。 (谷歌对这个问题没什么帮助,因为很多人都在谈论源代码,并且对Source
方法的任何引用都被埋没了。
我也没有在MSDN page on computation expressions的任何地方看到Source
。 QueryBuilder class使用Source
,所以我可以看一个例子,但没有解释为什么在其他情况下这会有用。
在什么情况下,您希望在自定义计算表达式构建器上使用Source
方法?如果默认ForEach
处理不足以满足某人的需求并且Source
方法有用,那会是什么情况?
答案 0 :(得分:4)
我对此没有任何内幕消息知识,但这就是为什么我认为该方法存在,基于内置QueryBuilder
的翻译和实现。
QueryBuilder
中的所有操作都代表使用QuerySource<'R, 'Q>
的数据源,其中'R
是元素的类型,'Q
是数据源的类型 - {{1} }或IEnumerable
。
只有一种数据类型的事实意味着它不需要为IQueryable
和IQueryable
定义单独的重载 - 否则需要这样做,因为最后的IEnumerable
方法需要为Run
和IEnumerable
执行不同的操作。
因此,IQueryable
方法允许您将查询可以处理的任何输入转换为数据源的某些“内部表示”。另一方面,Source
方法将数据从此内部表示转换为普通值。 (如果是Run
,您在自己的代码中看不到QueryBuilder
类型。)