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

时间:2017-04-23 07:00:49

标签: function f# append sequence elements

我有两个序列,一个名为Hand,有5个元素,另一个名为Deck,大小为n。我需要首先将Deck的第一个元素附加到Hand(创建大小为6的新Seq),然后在该新序列上运行一个函数来得到一个分数,例如50.然后我需要将Deck的第二个元素附加到Hand (同样是大小为6的新Seq)并运行该功能以获得25分。

这需要对Deck中的所有元素进行,以便我有一堆分数。这些分数是保存在列表中还是其他可能的并不重要。然后我需要找到所有这些结果的平均值并返回该值。

这是我之后的伪代码示例 -

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但我不确定如何通过追加和运行函数来完成第1部分分别为每个元素保存并保存该值。

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

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

1 个答案:

答案 0 :(得分:3)

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

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