真实世界使用 Currying

我们有一张信用卡清单,我们想计算信用卡公司必须支付的所有卡的保费。保费本身取决于信用卡的总数,因此公司会相应地调整它们。

我们已经有一个计算单个信用卡的保费的功能,并考虑了公司发行的总卡数:

case class CreditCard(creditInfo: CreditCardInfo, issuer: Person, account: Account)

object CreditCard {
  def getPremium(totalCards: Int, creditCard: CreditCard): Double = { ... }
}

现在,解决这个问题的一个合理方法是将每张信用卡映射到溢价并将其减少到一笔金额。像这样的东西:

val creditCards: List[CreditCard] = getCreditCards()
val allPremiums = creditCards.map(CreditCard.getPremium).sum //type mismatch; found : (Int, CreditCard) ⇒ Double required: CreditCard ⇒ ?

但是编译器不会喜欢这个,因为 CreditCard.getPremium 需要两个参数。部分应用于救援! 我们可以部分应用信用卡总数并使用该功能将信用卡映射到其保费。我们需要做的就是通过改变它来使用多个参数列表来调整 getPremium 函数,我们很高兴。

结果应如下所示:

object CreditCard {
  def getPremium(totalCards: Int)(creditCard: CreditCard): Double = { ... }
}

val creditCards: List[CreditCard] = getCreditCards()

val getPremiumWithTotal = CreditCard.getPremium(creditCards.length)_

val allPremiums = creditCards.map(getPremiumWithTotal).sum