在Scala中,多个参数列表和每个列表的多个参数有什么区别?

在Scala中,可以这样写(curried?)函数

def curriedFunc(arg1: Int) (arg2: String) = { ... }

上述curriedFunc函数定义与两个参数列表和单个参数列表中具有多个参数的函数之间的区别是什么?

def curriedFunc(arg1: Int, arg2: String) = { ... }

从数学的角度来看,这是(curriedFunc(x))(y)和curriedFunc(x,y),但我可以写def sum(x)(y)= xy,同样将def sum2(x,y) = xy

我知道只有一个区别 – 这是部分应用的功能。但两种方式对我都是等效的。

是否有其他差异?

严格地说,这不是一个curried函数,而是一个有多个参数列表的方法,虽然它看起来像一个函数。

正如你所说,多个参数列表允许使用该方法代替部分应用的函数。 (对不起,我使用的一般愚蠢的例子)

object NonCurr {
  def tabulate[A](n: Int, fun: Int => A) = IndexedSeq.tabulate(n)(fun)
}

NonCurr.tabulate[Double](10, _)            // not possible
val x = IndexedSeq.tabulate[Double](10) _  // possible. x is Function1 now
x(math.exp(_))                             // complete the application

另一个好处是,如果第二个参数列表由单个函数或thunk组成,您可以使用大括号而不是圆括号。例如。

NonCurr.tabulate(10, { i => val j = util.Random.nextInt(i + 1); i - i % 2 })

IndexedSeq.tabulate(10) { i =>
  val j = util.Random.nextInt(i + 1)
  i - i % 2
}

或者为thunk:

IndexedSeq.fill(10) {
  println("debug: operating the random number generator")
  util.Random.nextInt(99)
}

另一个优点是,你可以参考上一个参数列表的参数来定义默认的参数值(虽然你也可以说它是一个缺点,你不能在单个列表中这样做:)

// again I'm not very creative with the example, so forgive me
def doSomething(f: java.io.File)(modDate: Long = f.lastModified) = ???

最后,还有另外三个应用程序在回答相关的帖子Why does Scala provide both multiple parameters lists and multiple parameters per list?。我会把它们复制在这里,但信用到Knut Arne Vedaa,Kevin Wright和extempore。

首先:你可以有多个var args:

def foo(as: Int*)(bs: Int*)(cs: Int*) = as.sum * bs.sum * cs.sum

…这在单个参数列表中是不可能的。

第二,它帮助类型推理:

def foo[T](a: T, b: T)(op: (T,T) => T) = op(a, b)
foo(1, 2){_ + _}   // compiler can infer the type of the op function

def foo2[T](a: T, b: T, op: (T,T) => T) = op(a, b)
foo2(1, 2, _ + _)  // compiler too stupid, unfortunately

最后,这是你可以有隐式和非隐式参数的唯一方法,因为implicit是一个整数参数列表的修饰符:

def gaga [A](x: A)(implicit mf: Manifest[A]) = ???   // ok
def gaga2[A](x: A, implicit mf: Manifest[A]) = ???   // not possible
http://stackoverflow.com/questions/6803211/whats-the-difference-between-multiple-parameters-lists-and-multiple-parameters

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:在Scala中,多个参数列表和每个列表的多个参数有什么区别?