Nói một cách chính xác, đây không phải là một hàm curry, mà là một phương thức có nhiều danh sách đối số, mặc dù phải thừa nhận rằng nó trông giống như một hàm.
Như bạn đã nói, danh sách nhiều đối số cho phép phương thức được sử dụng thay cho một hàm được áp dụng một phần. (Xin lỗi vì những ví dụ thường ngớ ngẩn mà tôi sử dụng)
object NonCurr {
def tabulate[A](n: Int, fun: Int => A) = IndexedSeq.tabulate(n)(fun)
}
NonCurr.tabulate[Double](10, _)
val x = IndexedSeq.tabulate[Double](10) _
x(math.exp(_))
Một lợi ích khác là bạn có thể sử dụng dấu ngoặc nhọn thay vì dấu ngoặc đơn trông đẹp mắt nếu danh sách đối số thứ hai bao gồm một hàm duy nhất hoặc thunk. Ví dụ
NonCurr.tabulate(10, { i => val j = util.Random.nextInt(i + 1); i - i % 2 })
đấu với
IndexedSeq.tabulate(10) { i =>
val j = util.Random.nextInt(i + 1)
i - i % 2
}
Hoặc đối với tiếng sét:
IndexedSeq.fill(10) {
println("debug: operating the random number generator")
util.Random.nextInt(99)
}
Một ưu điểm khác là, bạn có thể tham khảo các đối số của danh sách đối số trước đó để xác định các giá trị đối số mặc định (mặc dù bạn cũng có thể nói rằng đó là một nhược điểm là bạn không thể làm điều đó trong danh sách đơn lẻ :)
def doSomething(f: java.io.File)(modDate: Long = f.lastModified) = ???
Cuối cùng, có ba ứng dụng khác trong câu trả lời cho bài đăng liên quan Tại sao Scala cung cấp cả danh sách nhiều tham số và nhiều tham số trên mỗi danh sách? . Tôi sẽ chỉ sao chép chúng ở đây, nhưng tín dụng sẽ được chuyển đến Knut Arne Vedaa, Kevin Wright và người mở rộng.
Đầu tiên: bạn có thể có nhiều var args:
def foo(as: Int*)(bs: Int*)(cs: Int*) = as.sum * bs.sum * cs.sum
... mà sẽ không thể có trong một danh sách đối số.
Thứ hai, nó hỗ trợ kiểu suy luận:
def foo[T](a: T, b: T)(op: (T,T) => T) = op(a, b)
foo(1, 2){_ + _}
def foo2[T](a: T, b: T, op: (T,T) => T) = op(a, b)
foo2(1, 2, _ + _)
Và cuối cùng, đây là cách duy nhất bạn có thể có các args ngầm định và không ngầm định, cũng như implicit
một công cụ sửa đổi cho toàn bộ danh sách đối số:
def gaga [A](x: A)(implicit mf: Manifest[A]) = ???
def gaga2[A](x: A, implicit mf: Manifest[A]) = ???