2015-12-02 60 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