【问题标题】:Scala - Method type parametersScala - 方法类型参数
【发布时间】:2019-01-19 15:09:10
【问题描述】:

我正在尝试理解 scala 编译器自动生成的一些代码,但我不知道要搜索什么。

我有以下课程:

trait Arrow1[F[_, _]]

abstract class Test {

  def f1[F[_, _] : Arrow1, A, B, C](fa: F[A,B], fb: F[A, C]): F[A, (B, C)]

  def f2[A: Seq, B](a: A): Boolean
}

反编译类文件后,f1 和 f2 方法的签名如下:

public abstract class Test {
    public abstract <F, A, B, C> F f1(F var1, F var2, Arrow1<F> var3);

    public abstract <A, B> boolean f2(A var1, Seq<A> var2);
}

如您所见,这些方法有一个附加参数。我在哪里可以找到有关此方法类型参数表示法 F[_, _] : Arrow1 的一些文档?

【问题讨论】:

  • 实际上,它可以被标记为重复:What are Scala context and view bounds?,但我决定保留当前规范中的引号,而不是重定向到 2010 年的答案(它并没有太大改变 wrt 上下文边界,但仍然...)。

标签: scala types type-parameter context-bound


【解决方案1】:

您正在寻找“上下文边界”

当您在规范中查找 "Type parameters" 时,您会在第一段中遇到 A: B,并且您还会获得指向 Context Bounds and View Bounds 的链接,上面写着 (报价略有变化,简化为单个上下文绑定的情况)

方法或非特征类的类型参数A 也可以有一个或 更多上下文边界A : T。在这种情况下,类型参数可能是 实例化为任何类型 S S 满足绑定 T 的实例化点。这样的证据 由 T[S] 类型的隐式值组成。

包含类型参数的方法或类,带有视图或上下文 bounds 被视为等同于具有隐式的方法 参数。首先考虑单个参数的情况 [...] 上下文边界,例如:

def f[A: U1](params): R = ...

然后上面的方法定义扩展为

def f[A](params)(implicit v1: U1[A]): R  = ...

v1 是新引入的隐式函数的新名称 范围。该参数称为证据参数。

这里是link to FAQ,其中包含有关该主题的更多信息。

【讨论】:

    猜你喜欢
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 2012-01-08
    相关资源
    最近更新 更多