Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 为什么要在自定义计算表达式生成器中使用Builder.Source()?_F# - Fatal编程技术网

F# 为什么要在自定义计算表达式生成器中使用Builder.Source()?

F# 为什么要在自定义计算表达式生成器中使用Builder.Source()?,f#,F#,通过阅读,我在PDF的第79页看到了以下内容: 辅助功能src(e)表示b.Source(e)如果最里面的ForEach来自用户代码,而不是通过翻译生成的,并且生成器b包含源方法。否则,src(e)表示e 这是在规范详细(非常详细)描述如何解析计算表达式并将其转换为表达式生成器对象上的一系列方法调用的上下文中,我发现它在帮助我理解计算表达式背后的其他概念方面非常有价值,它没有提到源方法,也没有我能找到的任何其他参考资料。(谷歌在这方面帮不了什么忙,因为很多人都在谈论源代码,而对source方法的

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

辅助功能
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
方法将此内部表示中的数据转换为普通值。”——这句话让我“点击”。谢谢,这就是我需要的解释。