【问题标题】:Scala multiple parameter lists and partial bindingScala 多参数列表和部分绑定
【发布时间】:2016-06-16 05:19:11
【问题描述】:

我正在学习 Scala Coursera 课程,而讲座似乎缺少对多个参数列表如何真正起作用的解释。

他声称可以仅使用第一个参数 (f) 调用下面的 averageDamp() 函数,允许您稍后使用第二个参数调用它。似乎您需要通过使用“_”来明确地进行部分绑定。

但是,如果将部分绑定调用传递给另一个函数,该函数接受具有与部分绑定函数匹配的签名的函数,它将隐式接受它,不需要“_”。

然而他根本没有使用术语部分绑定,只是说在 Scala 中有一种特殊的语法可以基本上返回一个闭包,而实际上它只是部分绑定。还是不行?

scala> def averageDamp(f: Double => Double)(x: Double) = (x+f(x))/2

scala> def fixedPoint(f: Double => Double)(x: Int) = f(x)+1

scala> fixedPoint(averageDamp(x=>x+1))(2)
res29: Double = 3.5

scala> averageDamp(x=>x+1)
<console>:19: error: missing arguments for method averageDamp;
follow this method with `_' if you want to treat it as a partially applied function
       averageDamp(x=>x+1)

averageDamp 的非部分绑定版本可能类似于:

def averageDamp(f: Double => Double): (Double => Double) = 
    def inner(x: Double): Double =
        (x+f(x))/2    
    inner

我想我的问题是...averageDamp() 的多参数列表版本是否被传递给另一个函数只是隐式部分绑定...或者这真的是某种特殊的 Scala 语法,用于返回内部函数/关闭?

【问题讨论】:

  • 郑重声明,scala -print 可以回答很多此类问题(尽管您必须深入研究与 repl 相关的代码)。您可以看到,出于性能原因,def foo(a: Int)(b: Int): Int 被编译为 def foo(a: Int, b: Int): Int

标签: scala


【解决方案1】:

然而他根本不使用术语部分绑定,只是说在 Scala 中有一种特殊的语法基本上可以返回一个闭包,而实际上它只是部分绑定......是多参数列表版本averageDamp() 被传递给另一个函数只是隐式的部分绑定......或者这真的是某种特殊的 Scala 语法,用于返回内部函数/闭包?

为什么你认为它是其中之一?仅提供部分参数列表是具有多个参数列表的方法的部分应用(通常不是“绑定”)的特殊语法。

【讨论】:

  • “仅提供部分参数列表是部分应用的特殊语法”除非我这样做会导致错误,例如“缺少方法 averageDamp 的参数;如果您使用 `_' 遵循此方法想把它当作一个部分应用的函数”。
  • 是的,_ 是此语法的一部分(如果预期类型是函数类型,则允许省略)。
猜你喜欢
  • 2015-10-20
  • 2014-01-18
  • 2017-06-29
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 2018-12-22
  • 2011-10-11
相关资源
最近更新 更多