关于扩展的 Scala 方法签名

On Expanded Scala Method signatures

几个月后,我对 Scala 几乎完全陌生。我注意到一些疯狂的签名。我已经学习了 contrapositive/copositive/extensions/invariance 的泛型和大部分基础知识。但是,我继续发现一些方法签名有点令人困惑。虽然我找到示例并知道签名产生的内容,但对于某些功能我仍然有点不知所措。谷歌搜索我的问题让我没有答案。我确实有一个普遍的想法,即人们喜欢将基本的 CS 1 东西打死。我什至试图在 scala 网站上找到答案。也许我对 "expanded method signature" 和 "defining function use in scala signature" 之类的措辞有误。谁能解释一下这个签名?

futureUsing[I <: Closeable, R](resource: I)(f: I => Future[R])(implicit ec: ExecutionContext):Future[R]

我的猜测是,在初始泛型和带有类型 I 参数的参数声明之后,主体被定义,最后部分是函数特定的任何对象或必须在隐式范围内查找的对象(是他们后来销毁了?)。任何人都可以设计一个扩展的方法签名以便我知道我正在使用什么代码吗?最后两部分是否有特定的顺序?

备注

经过更多搜索,我找到了一些可以拼凑的有效回复:

-Scala - Currying and default arguments

-why in Scala a function type needs to be passed in separate group of arguments into a function

没有固定的顺序,只是隐式必须在最后。安置是关于从左到右流动的依赖性,正如上述答案之一指出的列表中的某个人所指出的那样。为什么我不能先有隐式,然后所有依赖于它们的东西都很奇怪,因为没有可用的东西会导致错误,而且事情很可能取决于给定的隐式。

不过,我还是有点懵。当指定 f: I => Future[R] 并需要提供最后一个参数时,假设它是隐式的,我是否需要做更多类似的事情:

futureUsing(resourceOfI)({stuff => doStuff(stuff)})(myImplicit)

这是否正确?

我能做吗:

futureUsing(resourceOfI)(myImplicit)({stuff => doStuff(stuff)})

为什么?我真的想找出根本原因,而不仅仅是二元的是或否。

最后的笔记

我刚找到这个答案。看来顺序不能改了。如有不妥请指正

Can anyone explain this signature?

futureUsing[I <: Closeable, R]

futureUsing 适用于两种不同的类型(两种类型参数)。我们不知道它们到底是什么类型,但我们将调用一个 I(输入),它是(或派生自)Closable,另一个 R(结果).

(resourse: I)

futureUsing 的第一个柯里化参数是 I 类型。我们称之为 resourse.

(f: I => Future[R])

第二个 curried 参数 f 是一个函数,它接受类型为 I 的参数和 returns 一个 Future 将(最终)包含一些东西输入 R.

(implicit ec: ExecutionContext)

第三个柯里化参数 ec 的类型为 ExecutionContext。此参数是隐式的,这意味着如果在调用 futureUsing 时未提供它,编译器将在已声明 implicit 的范围内查找 ExecutionContext 并将其作为第三个参数。

:Future[R]

futureUsing returns 包含 R.

类型结果的 Future

Is there a specific ordering to this?

隐式参数必须是最后(最右边)的参数。除此之外,不,resoursef 可以按任一顺序声明。当然,在调用时,参数的顺序必须与定义中声明的顺序相匹配。

Do I need ... implicits to drag in?

ExecutionContext 的情况下,让编译器使用 import scala.concurrent.ExecutionContext 中可用的内容。只有在极少数情况下,您才会需要不同的东西。

...how would Scala use the 2nd curried argument...

futureUsing 的正文中,我希望看到 f(resourse)f 采用 I 类型的参数。 resourse 属于 I 类型。 f returns Future[R] futureUsing 也是如此,所以行 f(resourse) 可能是 futureUsing.[=53= 正文中的最后一条语句]