scala - 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?
解决方案
您正在寻找“上下文边界”。
当您在规范中查找“类型参数”A: B
时,您会在第一段中遇到,并且您还会获得指向Context Bounds 和 View Bounds的链接,其中显示
(引用略有变化,简化为单个上下文绑定的情况):
A
方法或非特征类的类型参数也可能有一个或多个上下文边界A : T
。在这种情况下,类型参数可以被实例化为在满足边界S
的实例化点存在证据的任何类型。此类证据由 type 的隐含值组成。S
T
T[S]
包含具有视图或上下文边界的类型参数的方法或类被视为等同于具有隐式参数的方法。首先考虑具有 [...] 上下文边界的单个参数的情况,例如:
def f[A: U1](params): R = ...
然后将上面的方法定义扩展为
def f[A](params)(implicit v1: U1[A]): R = ...
其中
v1
是新引入的隐式参数的新名称。该参数称为证据参数。
这是常见问题解答的链接,其中包含有关该主题的更多信息。
推荐阅读
- java - “变量可能尚未初始化”在哪里使用 switch case 进行初始化?
- networking - 在路由器上阻止 YouTube 后,仍可通过 Chrome 移动浏览器访问 YouTube
- java - OpenCV Java - 如何从文档图像中获取感兴趣的区域?
- xml - XML 与 XMLUnit 的比较在列表具有不同复杂元素和排序的特定场景中不起作用
- python - 捕获子进程调用 stdout/stderr
- python - 数据框中的每日数据到每周
- jsf - 无法使其成为 JSF 测试项目
- python - 动态序列化程序 Django REST:“AttributeError:'Serializer' 对象没有属性 'pk'”
- node.js - 如何访问结构体数组,从 ffi 作为指针返回
- architecture - Vertical Slice Architecture - Controller、Command/Query、Response、CommandHandler 中应该包含哪些内容?