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
答案 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)