繁体   English   中英

为什么在带有隐式参数的另一个方法上定义包装方法不起作用?

[英]Why defining a wrapping method over another method with an implicit argument doesn't work?

编写此失败的类型检查:

val list = List(1,3,5,2,4)

list sortBy (i => -i) //this is ok

def wrappedSort[A,B](a: List[A])(by: A => B): List[A] = {
     a sortBy by
} // this fails type check

wrappedSort(list)(i => -i) //So this won't work either

我们知道编译错误是: No implicit Ordering defined for B.

为了使其工作,我必须使Wrapper方法具有与包装方法相同的隐式参数,即:

import math.Ordering

def wrappedSort[A,B](a: List[A])(by: A => B)(implicit ord: Ordering[B]): List[A] = {
     a sortBy by
}

但这很烦人。 在尝试抽象或扩展某些库代码时,遇到了一些复杂的上下文边界,必须手动重新实现。 有没有一种解决方法,我不必在自己的摘要中指定隐式参数?

在这种情况下, PreDef (除非您在编译器中专门禁用它,否则它会处在范围内)有一个Ordering[Int]实例可用。 因此,编译器不会失败,因为它在范围内,并且知道必须搜索以找到的确切隐式。 当您向抽象B提供该函数签名时,您实际上告诉编译器,将不会为B提供所有BOrdering (实际上是已知Universe中的每个单一类型),并且要求B具有所指示的Ordering List上的sortBy函数执行的操作立即失败。

确实没有一种方法可以避免这种情况,也根本不需要避免这种情况。 这是设计使然,并且是编译器的安全功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM