我是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
中采用了什么概念?一旦知道要查找的内容,我将继续阅读!
谢谢
最佳答案
这称为Currying
。 curry 函数的类型为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
。您不必一口气提供所有参数。
因此,在您的情况下,您可以提供amount
,a
和b
。您将获得一个带有Transaction
的函数。另一种情况是Request => DataBase => Int
类型的函数,您只需要提供Request
,最后当您确实需要运行请求时,提供必须将请求发送到的DataBase
。(A, B) => C
和A => B => C
类型是同构的。 Scala提供了做到这一点的tupled
和uncurried
。def curriedFoo(a: A)(b: B): C = a => b => foo(a, b)
def foo(a: A, b: B): C => (a, b) => curriedFoo(a, b)
关于scala - 为什么在此Scala方法定义中有两组参数/括号?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13548308/