真實世界使用 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