为什么要在自定义计算表达式构建器中使用Builder.Source()?
通过阅读F#4.0规范,我看到了PDF的第79页的以下内容:
辅助函数src(e)
表示b.Source(e)
如果最里面的ForEach来自用户代码而不是由翻译生成,并且构建器b
包含Source
方法。 否则, src(e)
表示e
。
这是关于如何解析计算表达式并将其转换为表达式构建器对象的一系列方法调用的详细说明(非常详细)的描述的上下文。 Scott Wlaschin的Computation Expressions系列,我发现它对帮助我理解计算表达式背后的其他概念是无价的,但没有提到Source
方法,也没有提到我能找到的任何其他参考。 (谷歌是没有多大帮助的这一个,因为成千上万的人谈论的源代码和任何引用Source
的方法被埋没)。
我也没有在计算表达式的MSDN页面的任何地方看到Source
记录。 QueryBuilder类使用Source
,所以我可以看一个例子,但没有解释为什么在其他情况下它会有用。
在什么情况下你想在自定义计算表达式生成器上使用Source
方法? 什么样的情况下,默认的ForEach
处理不足以满足需求,而Source
方法会有用?
我没有这方面的内幕知识,但这就是为什么我认为这种方法存在,基于翻译和内置QueryBuilder
。
QueryBuilder
所有操作都使用QuerySource<'R, 'Q>
表示数据源QuerySource<'R, 'Q>
其中'R
是元素的类型, 'Q
是数据源的种类 - IEnumerable
或IQueryable
。
事实上,只有一种数据类型意味着它不需要为IQueryable
和IEnumerable
定义单独的重载 - 否则将需要这种重载,因为最后的Run
方法需要为IEnumerable
和IQueryable
做不同的事情。
因此, Source
方法可以将查询可以处理的任何输入转换为数据源的某种“内部表示”。 在另一端, Run
方法将数据从该内部表示转换为普通值。 (在QueryBuilder
情况下,你永远不会在你自己的代码中看到QuerySource
类型。)
上一篇: Why would you use Builder.Source() in a custom computation expression builder?
下一篇: F# computation expression transparent state passing with Bind