使用Scala进行currying的实际好处

时间:2016-03-12 17:11:58

标签: scala function functional-programming currying

add(x:Int)(y:Int) = x + y

add(5)(5) => 
add(5) _ => int => int = function

当然我们可以使用currying +一个部分应用的函数来创建一个新函数,但我发现很难读取这样的代码。

你能否展示一个与Scala讨论的有用例子?

2 个答案:

答案 0 :(得分:1)

好的,这是一个有用的例子 - 隐式参数。每个方法都可以将其最后一个参数列表标记为implicit,这意味着如果编译器在范围内找到它们,它将自动提供所需的参数。如果您有隐式参数之外的参数,则它们必须位于隐式参数列表之前的单独参数列表中,这意味着该方法需要进行咖喱。

class MyClass(val value: String) {}

implicit def intToString(i: Int) = i.toString
implicit def doubleToString(d: Double) = d.toString
implicit def myClassToString(m: MyClass) = m.value

def append[T](t: T, s: String)(implicit ev: T => String) = t + s

val result1 = append(3, " is now a string")
val result2 = append(3.5, " is now a string")
val result3 = append(new MyClass("myClass"), " is now a string")

答案 1 :(得分:0)

我也发现很难找到一个很好的例子,所以我写了一篇关于它的博客文章! A real world Currying example.

答案基本上归结为:

  

Currying很棒。它允许我们轻松地重用更抽象的东西   功能。我们可以轻松创建更专业的功能   部分应用咖喱功能。这一点尤为重要   因为我们经常需要将非常具体的函数传递给更高阶   像map,filter或reduce这样的函数。

这是博客文章中的一个例子:

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