46

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

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

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

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

谢谢

4

1 回答 1

29

这被命名为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. 您不必一次性提供所有论点。

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

类型(A, B) => CA => B => C是同构的。Scala 提供了tupledand uncurriedthat 就是这样做的。

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

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

于 2017-01-25T11:43:06.847 回答