add(x:Int)(y:Int) = x + y
add(5)(5) =>
add(5) _ => int => int = function
当然我们可以使用currying +一个部分应用的函数来创建一个新函数,但我发现很难读取这样的代码。
你能否展示一个与Scala讨论的有用例子?
答案 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