为什么要在自定义计算表达式构建器中使用Builder.Source()?

时间:2016-02-09 07:51:07

标签: f#

通过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的任何地方看到SourceQueryBuilder class使用Source,所以我可以看一个例子,但没有解释为什么在其他情况下这会有用。

在什么情况下,您希望在自定义计算表达式构建器上使用Source方法?如果默认ForEach处理不足以满足某人的需求并且Source方法有用,那会是什么情况?

1 个答案:

答案 0 :(得分:4)

我对此没有任何内幕消息知识,但这就是为什么我认为该方法存在,基于内置QueryBuilder的翻译和实现。

QueryBuilder中的所有操作都代表使用QuerySource<'R, 'Q>的数据源,其中'R是元素的类型,'Q是数据源的类型 - {{1} }或IEnumerable

只有一种数据类型的事实意味着它不需要为IQueryableIQueryable定义单独的重载 - 否则需要这样做,因为最后的IEnumerable方法需要为RunIEnumerable执行不同的操作。

因此,IQueryable方法允许您将查询可以处理的任何输入转换为数据源的某些“内部表示”。另一方面,Source方法将数据从此内部表示转换为普通值。 (如果是Run,您在自己的代码中看不到QueryBuilder类型。)