F# 为什么要在自定义计算表达式生成器中使用Builder.Source()?
通过阅读,我在PDF的第79页看到了以下内容: 辅助功能F# 为什么要在自定义计算表达式生成器中使用Builder.Source()?,f#,F#,通过阅读,我在PDF的第79页看到了以下内容: 辅助功能src(e)表示b.Source(e)如果最里面的ForEach来自用户代码,而不是通过翻译生成的,并且生成器b包含源方法。否则,src(e)表示e 这是在规范详细(非常详细)描述如何解析计算表达式并将其转换为表达式生成器对象上的一系列方法调用的上下文中,我发现它在帮助我理解计算表达式背后的其他概念方面非常有价值,它没有提到源方法,也没有我能找到的任何其他参考资料。(谷歌在这方面帮不了什么忙,因为很多人都在谈论源代码,而对source方法的
src(e)
表示b.Source(e)
如果最里面的ForEach来自用户代码,而不是通过翻译生成的,并且生成器b
包含源方法。否则,src(e)
表示e
这是在规范详细(非常详细)描述如何解析计算表达式并将其转换为表达式生成器对象上的一系列方法调用的上下文中,我发现它在帮助我理解计算表达式背后的其他概念方面非常有价值,它没有提到源方法,也没有我能找到的任何其他参考资料。(谷歌在这方面帮不了什么忙,因为很多人都在谈论源代码,而对source
方法的任何引用都会被埋没)
我也没有看到Source
文档记录在文档中的任何地方。使用源代码
,所以我有一个例子可以看,但是没有解释为什么这在其他情况下有用
在什么情况下,您希望在自定义计算表达式生成器上有一个Source
方法?如果默认的ForEach
处理不足以满足需要,而源代码方法会很有用,那会是什么样的场景呢?我对此没有任何内部知识,但以下是我认为该方法存在的原因,基于内置QueryBuilder
中的翻译和实现
QueryBuilder
中的所有操作都使用QuerySource
表示数据源,其中'R
是元素的类型,'Q
是数据源的类型-IEnumerable
或IQueryable
事实上,只有一种数据类型意味着它不需要为IQueryable
和IEnumerable
定义单独的重载,否则这是需要的,因为最后的Run
方法需要为IEnumerable
和IQueryable
执行不同的操作
因此,Source
方法允许您将查询可以处理的任何输入转换为数据源的某种“内部表示”。在另一端,Run
方法将此内部表示中的数据转换为普通值。(如果是QueryBuilder
,您永远不会在自己的代码中看到QuerySource
类型。)@mydogisbox-感谢您提供的链接,但我在前面看到了该页面。我意识到,
子句中的的内容正在调用Source()
(即,for x
中的项产生对Source(x)
的调用)。我知道Source
应该返回适合传递到For
的内容。不过,我不太明白为什么QueryBuilder.Source
需要IEnumerable或IQueryable(继承自IEnumerable),这两者都适合于for
函数进行迭代。那么为什么这里需要源代码调用呢?为什么不直接说“他们给了我一个IEnumerable,所以我会重复它”?我想我们谈论的是同一件事,我只是没有足够的空间来解释我的意思。我说的For
是QueryBuilder.For
,它被调用来处理query{**For**customer in db中的For
表达式。Customers确实选择customer}
,因此,Source
方法允许您将查询可以处理的任何输入转换为某种“内部表示”“数据源的名称。另一方面,Run
方法将此内部表示中的数据转换为普通值。”——这句话让我“点击”。谢谢,这就是我需要的解释。