F#:如何处理元组列表?

F#: How to process a list of tuples?

我正在做家庭作业。而且我正在尝试学习 F#,所以除了使用 List.Map 或 lambda 之类的基本东西外,我不想要任何捷径。 我正在尝试处理元组列表,但无法访问列表中的元组。 我想获取元组列表,将每个元组中的数字相加,然后 return 这个数字,每次都打印出来。

let listTup = [(2,3,4); (4,5,6); (6,7,8)]

let getSum (a,b,c) =
    a+b+c

let rec printSum tpList =
let total = 0
match tpList with
| [] -> total //return 0 if empty list
| hd::tl -> 
    print (getSum hd)

您要做的第一件事是通过 getSum 函数映射您的元组。这可以非常简单地通过将元组列表传送到 List.map getSum 中来完成。然后你想打印列表中的每个元素,所以你用函数 printfn "%d"List.map getSum 的结果传递给 List.iter。这是因为函数具有柯里化参数。 printfn "%d""%d" 参数应用于 printfn 和 returns 一个采用整数的函数,然后将其打印出来。整个事情看起来像这样:

let listTup = [(2,3,4); (4,5,6); (6,7,8)]

let getSum (a,b,c) =
    a + b + c

let printSum tpList =
    tpList |> List.map getSum |> List.iter (printfn "%d")

这会打印:

9
15
21

如果我们利用函数组合(>> 运算符),我们甚至可以进一步简化函数。请注意,printSumtpList 作为其参数,然后仅将其用作两个管道连接在一起的函数的输入。由于流水线只是获取一个函数的输出并将其作为另一个函数的最后一个参数传递,我们真正需要做的就是编写函数 List.map getSum,它接受一个 int 三元组的列表,并且returns intList.iter (printfn "%d") 的列表,它采用 int 和 returns 单元的列表。看起来像这样:

let printSum = List.map getSum >> List.iter (printfn "%d")

这将打印相同的结果,但是是一种更简单的函数表达方式。

F# 也有命令式循环。在这种情况下,我认为命令式循环最符合问题。

let listTup = [(2,3,4); (4,5,6); (6,7,8)]
for a,b,c in listTup do
  let sum = a + b + c
  printfn "%d" sum