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

rmu*_*unn 5 f#

通过阅读F#4.0规范,我在PDF的第79页看到了以下内容:

辅助函数src(e)表示b.Source(e)最里面的ForEach是来自用户代码而不是由转换生成,并且构建器b包含Source方法.否则,src(e)表示e.

这是在spec的详细(非常详细)描述如何解析计算表达式并将其转换为表达式构建器对象上的一系列方法调用的上下文中.Scott Wlaschin的Computation Expressions系列,我发现它非常有助于我理解计算表达式背后的其他概念,但没有提到Source方法,也没有提到我能找到的任何其他参考.(谷歌对这个问题没什么帮助,因为很多人都在谈论源代码,并且任何对Source方法的引用都被埋没了).

我也没有SourceMSDN页面的任何地方看到有关计算表达式的文档.该QueryBuilder的类使用Source,所以我有一个例子,我可以看看,但没有为什么,这将是在其它情况下是有用的解释.

在什么情况下你想Source在自定义计算表达式构建器上有一个方法?什么是默认ForEach处理不足以满足某人需求并且Source方法有用的情况?

Tom*_*cek 8

我对此没有任何内部知识,但这就是为什么我认为该方法存在的原因,基于内置QueryBuilder.

在所有的操作QueryBuilder使用表示数据源QuerySource<'R, 'Q>,其中'R是元素的类型和'Q任一-是那种数据源的IEnumerableIQueryable

只有一种数据类型的事实意味着它不需要为IQueryableand定义单独的重载IEnumerable- 否则需Run要这样做,因为最后的方法需要为IEnumerable和 for做不同的事情IQueryable

因此,该Source方法允许您将查询可以处理的任何输入转换为数据源的某种“内部表示”。在另一端,该Run方法将来自内部表示的数据转换为普通值。(对于QueryBuilder,您永远不会QuerySource在自己的代码中看到该类型。)