引用记录中的通用值

时间:2015-12-02 16:42:41

标签: f# record

以下是我用来从记录类型中提取特定值的代码示例:

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#中实现上述内容吗?

1 个答案:

答案 0 :(得分:4)

为什么不让 accessor -function成为这样的参数:

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

并像

一样使用它
let extractVal1 = extract (fun y -> y.Val1)
let extractVal2 = extract (fun y -> y.Val2)

请注意我无法测试代码,因为您没有包含足够的信息 - 因此可能会出现一些错误