【问题标题】:On Expanded Scala Method signatures关于扩展的 Scala 方法签名
【发布时间】:2017-01-31 08:33:38
【问题描述】:

几个月后,我对 Scala 几乎完全陌生。我注意到一些狂野的签名。我已经研究过具有对立/共正/扩展/不变性的泛型,以及大多数基础知识。但是,我继续发现一些方法签名有点令人困惑。虽然我找到了示例并知道签名产生了什么,但对于某些功能,我仍然有点茫然。谷歌搜索我的问题让我没有答案。我确实有一个普遍的想法,即人们喜欢将基本的 CS 1 东西打死。我什至试图在 scala 网站上找到答案。也许我的措辞像“扩展的方法签名”和“在 Scala 签名中定义函数使用”是错误的。谁能解释一下这个签名?

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

为什么?我真的想了解根本原因,而不仅仅是二进制是或否。

最后说明

我刚刚找到了这个答案。似乎无法更改顺序。如果我错了,请纠正我。

Scala: Preference among overloaded methods with implicits, currying and defaults

【问题讨论】:

    标签: scala function signature


    【解决方案1】:

    谁能解释一下这个签名?

    futureUsing[I <: Closeable, R]
    

    futureUsing 使用两种不同的类型(两个类型参数)。我们不确切知道它们是什么类型,但我们会调用一个I(输入),它是(或派生自)Closable,另一个是R(结果)。

    (resourse: I)
    

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

    (f: I => Future[R])
    

    第二个柯里化参数f是一个函数,它接受I类型的参数并返回一个Future,它(最终)将包含R类型的东西。

    (implicit ec: ExecutionContext)
    

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

    :Future[R]
    

    futureUsing 返回一个包含R 类型结果的Future


    这有特定的顺序吗?

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

    我需要... 隐式来拖入吗?

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

    ...Scala 将如何使用第二个咖喱参数...

    futureUsing 的正文中,我希望看到f(resourse)f 接受 I 类型的参数。 resourse 的类型为 If 返回 Future[R]futureUsing 所以行 f(resourse) 可能是 futureUsing 正文中的最后一条语句。

    【讨论】:

    • 所以有没有具体的顺序,我理解他们的工作。初始参数输入后,是否需要(体函数摄入)(隐含拖入)?我可以做例如 def futureUsing[E,V](par: E)(implicit ec:ExecutionContext)(f : E => Future[V]):Future[V]=Future{..... 另外,如何Scala 会使用第二个 curried 参数 (f : I => Future[R]) 而不将其作为隐式或指定的。
    猜你喜欢
    • 2011-03-08
    • 2010-12-23
    • 1970-01-01
    • 2016-04-03
    • 2010-11-09
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多