理解scala中的函数

6 scala function

问题严格来说是Scala语法,尽管它包含来自akka的一些代码(作为示例).

我对Scala很新.深入研究akka的源代码我想出了以下非常奇怪的方法:

def transform[C]
 (f: ExecutionContext ? Materializer ? Future[B] ? Future[C]): Unmarshaller[A, C] =
Unmarshaller.withMaterializer { implicit ec ? implicit mat ? a ? f(ec)(mat)(this(a)) }
Run Code Online (Sandbox Code Playgroud)

在哪里Unmarshaller.withMaterializer定义为

  def withMaterializer[A, B](f: ExecutionContext ? Materializer => A ? Future[B]): Unmarshaller[A, B]
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?什么是可怕的功能f: ExecutionContext => Materializer => Future[B] => Future[C].对我来说似乎更奇怪的是implicits 的序列:implicit ec => implicit mat => a => f(ec)(mat)(this(a))虽然withMaterializer根本没有隐式参数.

这种序列中的隐含意味着什么?

Vic*_*roz 2

f: ExecutionContext => Materializer => Future[B] => Future[C]只不过是一个柯里化函数,所以你可以像f(ec)(mat)(this(a))使用多个参数列表一样调用它(嗯,从技术上讲,参数列表不属于同一个函数,与 不同def f(...)(...),但这些都是细节)。换句话说f可以写成:

\n\n
f: ExecutionContext => { Materializer => { Future[B] => Future[C] } }`\n
Run Code Online (Sandbox Code Playgroud)\n\n

(返回一个函数的函数,该函数返回另一个函数)

\n\n

现在,如果你看一下f(ec)(mat)(this(a))有一个调用this(a),它是在上面定义的transform

\n\n
def apply(value: A)(implicit ec: ExecutionContext, materializer: Materializer): Future[B]\n
Run Code Online (Sandbox Code Playgroud)\n\n

this(a)只是对 的调用this.apply(a))。现在apply有两个隐式参数,即ec: ExecutionContextmaterializer:Materializer,因此调用它就像this(a)需要两个隐式值一样。这正是定义的含义implicit ec \xe2\x87\x92 implicit mat \xe2\x87\x92 a \xe2\x87\x92 f(ec)(mat)(this(a))。它将ecmat声明为所有嵌套函数体的隐式,因此this(a)可以选取它们。另一种可能性是写:

\n\n
ec \xe2\x87\x92 mat \xe2\x87\x92 a \xe2\x87\x92 f(ec)(mat)(this(a)(ec, mat))\n
Run Code Online (Sandbox Code Playgroud)\n