【问题标题】: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
      

      【讨论】:

        猜你喜欢
        • 2015-02-23
        • 2011-11-03
        • 2011-08-06
        • 1970-01-01
        • 2015-08-17
        • 2018-01-24
        • 2021-02-07
        • 1970-01-01
        • 2010-11-29
        相关资源
        最近更新 更多