scala - 理解scala中的函数

标签 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)) }

在哪里 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/

相关文章:

c++ - 将非常量参数传递给常量参数

c++ - 如何让程序确定最大的用户输入

javascript - 临时 JavaScript onclick 切换

scala - 在reactivemongo中找不到BSON Writer的隐式值

java - 如何使用 Apache POI 解析保存在 Excel 文件中的树结构

scala - 类值参数的类型成员的类型不匹配

scala - Spark 中 rtrim 函数的意外结果

arrays - 数组遍历中没有 var 或可破坏的 : How to "break" when a predicate is met,?

java - 有没有一种方法可以使用 Function< 将多个方法减少为一个方法? super T, ?> 作为方法参数?

c++ - 一次发布多个数据