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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.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#3.0)_F# - Fatal编程技术网

递归查询理解(F#3.0)

递归查询理解(F#3.0),f#,F#,我试图使用最近引入的F#3.0查询理解语法定义BOM表类查询。虽然可以使用yield来定义这类查询seq内存中集合的理解我不乏将这些集合转换为以可远程IQueryable源为目标的查询理解。我想困难的部分是“训练”提供者从递归模式中识别公共表表达式 有什么想法吗?不幸的是,我不认为F#3.0中当前的查询语法支持能够处理递归查询。主要问题是F#3.0依赖于主要为C#设计的标准IQueryable实现,因此它们不需要递归结构 我认为支持这一点相当困难。您可以实现自己的F#Quotes to SQL

我试图使用最近引入的F#3.0查询理解语法定义BOM表类查询。虽然可以使用
yield来定义这类查询
seq内存中集合的理解我不乏将这些集合转换为以可远程IQueryable源为目标的查询理解。我想困难的部分是“训练”提供者从递归模式中识别公共表表达式


有什么想法吗?

不幸的是,我不认为F#3.0中当前的查询语法支持能够处理递归查询。主要问题是F#3.0依赖于主要为C#设计的标准
IQueryable
实现,因此它们不需要递归结构

我认为支持这一点相当困难。您可以实现自己的F#Quotes to SQL translator(这很难),也可以实现某种预处理器,它接受包含递归的F#Quotes(查询),并将递归转换为LINQ to SQL translator可以处理的内容(但这可能也很难)

通常,方法是定义自己的查询生成器:

open System.IO
open Microsoft.FSharp.Quotations

type MyQueryBuilder() =
  member x.For(a, body) = Seq.collect body a
  member x.Quote(e) = e
  member x.YieldFrom(s) = s
  member x.Run(e:Expr<'T>) : 'T = failwithf "%A" e

// Example using the custom query builder
// (fails, printing the quoted query)
let mquery = MyQueryBuilder()    
let n = [1 .. 10]

let rec nums a : seq<int> =
  mquery { for b in n do
           yield! nums b }
opensystem.IO
打开Microsoft.FSharp.quotes
类型MyQueryBuilder()=
(a,主体)的成员x=以下集合主体a
成员x.Quote(e)=e
成员x.YieldFrom(s)=s

成员x.Run(e:ExprI)不想惹人讨厌,但如果你打算再次在这里发帖,你可能希望看看这个:你不需要签名或标语,事实上这有点令人沮丧。