F#函数以标签作为参数

时间:2014-02-16 15:27:06

标签: lambda f# functional-programming record

F#newbie在这里,并试图找到做事的“功能方式”。

我有一系列记录

type Node = {Value: int; Height: int; Width: int}
let dummyData = [|
    {Value = 1000; Height = 200;  Width = 200}
    {Value = 500;  Height = 1000; Width = 500}
    {Value = 2000; Height = 500;  Width = 100}
    |]

我希望找到记录中每个标签的最小值。对于每个标签,我可以找到使用Array.minBy编写函数来查找最小值,例如:

let findMinHeight xs = 
    let item = 
        xs |> Array.minBy (fun x -> x.Height)
    item.Height

然而,这感觉很麻烦,因为在这个例子中,我需要为每个标签写一次基本相同的功能3次。 是否可以构造一个单独的函数,该函数将特定标签与数组一起接收并返回适当的最小值?

我希望能够写出类似的内容:

let minHeight = findMin dummyData Height
let minWidth  = findMin dummyData Width
let minValue  = findMin dummyData Value

1 个答案:

答案 0 :(得分:3)

记录标签不是可以作为参数传递给函数的“第一类”值。但是,您可以编写一个findMin函数,将另一个函数作为参数 - 然后为其提供一个函数,该函数将Node并返回您记录的一个标签:

因此,我们添加f类型的参数Node -> 'T(类型'T是一个泛型类型参数,因此该函数可以使用不同类型的标签,只要它们是可比)。该函数在minBy中使用,然后获取结果item的属性:

let findMin (f:Node -> 'T) xs = 
    let item = xs |> Array.minBy f
    f item

要使用它,您可以编写(我添加f作为第一个参数,因此我们可以使用流水线操作符编写代码):

dummyData |> findMin (fun n -> n.Height)
dummyData |> findMin (fun n -> n.Width)