首页 > 解决方案 > Scala - 方法类型参数

问题描述

我试图理解 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

标签: scalatypestype-parametercontext-bound

解决方案


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

当您在规范中查找“类型参数”A: B时,您会在第一段中遇到,并且您还会获得指向Context Bounds 和 View Bounds的链接,其中显示 (引用略有变化,简化为单个上下文绑定的情况)

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

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

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

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

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

其中v1是新引入的隐式参数的新名称。该参数称为证据参数。

这是常见问题解答的链接,其中包含有关该主题的更多信息。


推荐阅读