2015-12-02 71 views
2

的下面的通用值的代码的示例,其我使用拉特定值,按名称,从一记录类型:参考从记录

let ExtractVal1 = // signature - 'seq<float[]>[]' 
    projectCF // signature - 'seq<Records>[]' 
    |> Array.Parallel.map (fun x -> 
     x |> Seq.map (fun y -> y.Val1) // Val1 is one of the values in my record type 
    ) 

let ExtractVal2 = 
    projectCF 
    |> Array.Parallel.map(fun x-> 
     x |> Seq.map (fun y -> y.Val2) // Val2 is another one of the values in my record type 
    ) 

上述工作正常,但所生成的很多重复(因为我需要为我想提取的5个值中的每一个重复该操作)。更清晰的是如果可以定义一个函数并将我想要提取的每个值的名称传递给它。以下是我喜欢做那种事的例子(尽管这显然代码不工作):

let ExtractAnyVal (anyval: MyRecord.x) = 
    projectCF 
    |> Array.Parallel.map (fun x-> 
     x |> Seq.map (fun y -> y.anyval) 
    ) 

let ExtractVal1 = ExtractAnyVal val1 
let ExtractVal2 = ExtractAnyVal val2 

我的问题是,我可以实现在F#以上?

回答

4

你为什么不只是使访问 - 函数的参数是这样的:

let extract f = 
    projectCF 
    |> Array.Parallel.map (Seq.map f) 

,并使用它像

let extractVal1 = extract (fun y -> y.Val1) 
let extractVal2 = extract (fun y -> y.Val2) 

请注意我无法测试的代码你没有提供足够的信息 - 所以可能会有一些错误

+0

谢谢,我已经测试过这个,它完美的作品。 – Pash101

+0

您将要多次映射集合,我会建议演示如何创建记录以将多个属性提取到一个结果容器中,例如, 'type ExtractedData = {One:int;两个:string}'和'let results = extract(fun y - > {One = y.Val1; Two = y.Val2})'。然后你可以一次提取多个属性。这可能有助于说明你建议的方法真的有多强大。 – TheInnerLight

+0

不要让我错,但无论如何所有的记录都在记忆中(并且平行映射似乎没有用,只是为了突出一些值) - 这就是为什么我只是回答这个问题而不想多想... – Carsten