【问题标题】:F# Append each element of a Seq to another separately then apply a function to eachF# 将 Seq 的每个元素分别附加到另一个元素,然后对每个元素应用一个函数
【发布时间】:2017-04-23 15:30:41
【问题描述】:

我有两个序列,一个叫做 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 但我不确定如何通过附加和运行函数来完成第一部分分别为每个元素保存该值。

我很难理解如何创建高阶函数,而且 F# 对我来说是新事物,与我所掌握的少数几种语言完全不同。

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

【问题讨论】:

  • 基本上,做一些类似于你上一个问题的事情,但使用averageby
  • 不同之处在于该问题只有 1 个序列,它使用 2 个序列,要求一个序列的元素分别附加到另一个序列并运行一个函数,这是我不明白的主要事情.

标签: function f# append sequence elements


【解决方案1】:

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

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

【讨论】:

  • 非常感谢!我真的需要研究如何正确创建高阶函数以及如何编写 lambda 函数。除了msdn,你知道任何好的资源吗,因为它很烂哈哈。
  • 实际上在我的代码中实现它会出错:在执行 Seq.average 时,类型 'int' 不支持运算符 'DivideByInt'。
  • Nvm 我通过在 |> Seq.average 之前添加 |> Seq.map float 来修复它!
  • @TJB - 如果您仍在阅读 MSDN 以了解 F#,那么您可能还没有被指向 fsharpforfunandprofit.com,这很可能是 Internet 上最好的 F# 站点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 2017-06-20
  • 2021-03-20
  • 2019-11-17
  • 2017-07-28
  • 2014-07-07
相关资源
最近更新 更多