F# 将 Seq 的每个元素分别附加到另一个元素,然后对每个元素应用一个函数

F# Append each element of a Seq to another separately then apply a function to each

我有两个序列,一个叫 Hand,有 5 个元素,另一个叫 Deck,大小为 n。我需要首先将 Deck 的第一个元素附加到 Hand(创建大小为 6 的新 Seq),然后 运行 该新序列上的一个函数以获得分数,例如 50。然后我需要附加第二个元素Deck to Hand(又是新的 6 号序列)和 运行s 函数得到 say 25。

这需要对 Deck 中的所有元素完成,以便我有一堆分数。这些分数是否保存到列表中或其他可能的方式并不重要。然后我需要找到所有这些结果的平均值和 return 该值。

这是我所追求的伪代码示例-

Hand = {S2; C5; HK; D9; C1}, Deck = {...a bunch of cards...}
score[0] = CalcScore (Hand.append Deck[0])  //e.g. CalcScore ({S2; C5; HK; D9; C1; HJ})
score[1] = CalcScore (Hand.append Deck[1])  //e.g. CalcScore ({S2; C5; HK; D9; C1; D2})
score[n] = CalcScore (Hand.append Deck[n])  //e.g. CalcScore ({S2; C5; HK; D9; C1; SQ})

return averageScore = score.average

我知道如果我可以创建一个包含每个单独分数的列表或序列,我可以只使用 Seq.average/List.average 但我不确定如何通过附加来完成第一部分运行分别为每个元素创建一个函数并保存该值。

我很难理解如何创建高阶函数,F# 对我来说是新的,与我了解的几种语言有很大不同。

任何指导或信息都会有很大帮助,谢谢!

首先,编写一个函数来计算给定要附加的卡片的分数:

let scoreWithAppendedCard card =
   CalcScore (Seq.append Hand [card])

太棒了!现在对牌组中的每张牌都这样做:

let allScores = Deck |> Seq.map scoreWithAppendedCard

现在剩下的就是计算平均值:

let averageScore = Seq.average allScores

或者您可以一次完成所有这些,而无需命名中间值:

let averageScore =
   Deck 
   |> Seq.map (fun card -> CalcScore (Seq.append Hand [card]))
   |> Seq.average