【问题标题】:practical benefits of currying with Scala [duplicate]使用 Scala 进行柯里化的实际好处 [重复]
【发布时间】:2016-06-27 21:52:25
【问题描述】:
add(x:Int)(y:Int) = x + y
add(5)(5) =>
add(5) _ => int => int = function
当然我们可以使用currying +一个部分应用的函数来创建一个新函数,但是我发现这样的代码很难阅读。
您能否展示一个使用 Scala 进行柯里化的有用示例?
【问题讨论】:
标签:
scala
function
functional-programming
currying
【解决方案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")
【解决方案2】:
我也发现很难找到一个好的例子,所以我写了一篇关于它的博客文章!
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