【问题标题】:F# Function which takes label as an argument将标签作为参数的 F# 函数
【发布时间】:2014-03-15 19:27:21
【问题描述】:

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

我有一个记录数组

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

【问题讨论】:

    标签: lambda f# functional-programming record


    【解决方案1】:

    记录标签不是可以作为参数传递给函数的“一流”值。但是,您可以编写一个将另一个函数作为参数的 findMin 函数 - 然后给它一个接受 Node 并返回记录标签之一的函数:

    因此,我们添加了一个Node -> 'T 类型的参数f'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)
    

    【讨论】:

      猜你喜欢
      • 2017-03-29
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-14
      • 2023-02-03
      相关资源
      最近更新 更多