gpt4 book ai didi

scala - 理解scala中的函数

转载 作者:行者123 更新时间:2023-12-04 15:40:57 25 4
gpt4 key购买 nike

这个问题严格来说是关于 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)) }

在哪里 Unmarshaller.withMaterializer定义为
  def withMaterializer[A, B](f: ExecutionContext ⇒ Materializer => A ⇒ Future[B]): Unmarshaller[A, B]

这里发生了什么?什么是恐怖功能 f: ExecutionContext => Materializer => Future[B] => Future[C] .我觉得更奇怪的是 implicit 的序列。 s: implicit ec => implicit mat => a => f(ec)(mat)(this(a))虽然 withMaterializer根本没有隐式参数。

在这样的序列中隐含的意思是什么?

最佳答案

f: ExecutionContext => Materializer => Future[B] => Future[C]只不过是一个柯里化(Currying)函数,所以你把它叫做 f(ec)(mat)(this(a))具有多个参数列表(好吧,从技术上讲,参数列表不属于与 def f(...)(...) 相同的函数,但这些都是细节)。换句话说f可以写成:

f: ExecutionContext => { Materializer => { Future[B] => Future[C] } }`

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

现在,如果您查看 f(ec)(mat)(this(a))有电话 this(a) ,在 transform 上方定义:
def apply(value: A)(implicit ec: ExecutionContext, materializer: Materializer): Future[B]

( this(a) 只是对 this.apply(a) 的调用)。现在 apply有两个隐式参数,即 ec: ExecutionContextmaterializer:Materializer ,所以称它为 this(a)你需要两个隐式值。究竟是什么定义 implicit ec ⇒ implicit mat ⇒ a ⇒ f(ec)(mat)(this(a))方法。它声明 ecmat作为所有嵌套函数体的隐含,所以 this(a)可以接他们。另一种可能性是写:
ec ⇒ mat ⇒ a ⇒ f(ec)(mat)(this(a)(ec, mat))

关于scala - 理解scala中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40454430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com