【问题标题】:Why are there two sets of arguments/parenthesis in this Scala method definition?为什么在这个 Scala 方法定义中有两组参数/括号?
【发布时间】:2012-11-12 22:52:59
【问题描述】:

我是 Scala 新手,正在阅读一些有关 ScalaSTM 的资料。

如果有人可以简单地命名下面的概念,我将不胜感激,其中有 2 组括号被传递给该方法。:

def transfer(amount: Int, a: Ref[Int], b: Ref[Int])(c: Transaction) {
  a.:=(a.get(c) - amount)(c)
  b.:=(b.get(c) + amount)(c)
}

c: Transaction 中采用了什么概念?

一旦我知道我在寻找什么,我会进一步阅读!

谢谢

【问题讨论】:

标签: scala syntax


【解决方案1】:

这被命名为Currying。柯里化函数的类型为 A => B => C。

函数def foo(a: A, b: B): C 的类型为(A, B) => C。 另一方面,函数def curriedFoo(a: A)(b: B): C 的类型为A => B => C。使用 curried 函数,您可以执行 def curriedFooWithA = curriedFoo(a),其类型为 B => C。您不必一次性提供所有论点。

因此,在您的情况下,您可以提供amountab。您将获得一个采用Transaction 的函数。另一种情况是Request => DataBase => Int 类型的函数,您只需提供Request,最后当您确实需要运行请求时,提供必须将请求发送到的DataBase

(A, B) => CA => B => C 类型是同构的。 Scala 提供了 tupleduncurried 来做这件事。

def curriedFoo(a: A)(b: B): C = a => b => foo(a, b)

def foo(a: A, b: B): C => (a, b) => curriedFoo(a, b)

【讨论】:

    猜你喜欢
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多