[英]Implicit method to function conversion doesn't work when passed as argument?
[英]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
提供所有B
的Ordering
(实际上是已知Universe中的每个单一类型),并且要求B
具有所指示的Ordering
List
上的sortBy
函数执行的操作立即失败。
确实没有一种方法可以避免这种情况,也根本不需要避免这种情况。 这是设计使然,并且是编译器的安全功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.