【问题标题】:Understanding Scala Currying理解 Scala 柯里化
【发布时间】:2018-01-24 21:14:02
【问题描述】:

我正在学习 coursera 的课程,该示例出现在讲座中,但是当我尝试运行它时,它会引发如下错误:

对象 HelloWorld 中缺少方法 mapReduce 的参数列表

仅当需要函数类型时,未应用的方法才会转换为函数。 您可以通过写mapReduce _mapReduce(_,_,_)(_,_) 而不是mapReduce 来明确这种转换。

var doo = mapReduce(x => x,(x,y)=>x*y,0)

下面是我要执行的代码。

def mapReduce(map: Int => Int, combine: (Int,Int)=>Int,
                zero: Int)(a: Int,b: Int): Int = {
  if (a>b) zero 
  else combine(map(a), mapReduce(map,combine,zero)(a+1,b))
}

var doo = mapReduce(x => x, (x,y)=>x*y, 0)
println(doo(1,4))

【问题讨论】:

    标签: scala currying


    【解决方案1】:

    mapReduce 想要两个参数列表,但你给了它一个。 试试这个:

    val doo = mapReduce(x => x, (x,y) => x*y, 0) _
    

    或等价的,

    val doo = mapReduce(identity, _*_, 0) _
    

    最后的_ 代表第二个参数列表。它告诉编译器您希望将后缀值作为函数值而不是要评估的表达式。

    您还可以通过显式声明预期的表达式类型来给编译器一个提示,使转换自动发生:

    val doo: (Int, Int) => Int = mapReduce(identity, _*_, 0)
    

    并且不要使用vars。他们是邪恶的。假装在 scala 中没有这样的关键字,直到您学习了足够多的语言,能够在实际需要时识别出极其罕见的情况。

    【讨论】:

      【解决方案2】:

      您必须定义一个 undescore 参数才能创建一个柯里化函数。像这样:

      scala> var doo = mapReduce(x => x, (x,y)=>x*y, 0) _
      doo: (Int, Int) => Int = <function2>
      
      scala> println(doo(1,4))
      0
      

      【讨论】:

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