参考previous answer of mine on stackoverflow
复杂性的核心只用一种方法说明:
implicit def traversableToFilterOps[CC[X] <: Traversable[X], T]
(xs: CC[T])(implicit witness: CC[T] <:< TraversableLike[T,CC[T]]) =
new MoreFilterOperations[CC[T], T](xs)
有两个问题:
有没有办法给编译器一个Map
符合签名CC[X] <: Traversable[X]
的提示?
我希望它匹配为Traversable[Tuple2[_,_]]
,但这不会发生。最后,我不得不写第二个方法CC[KX,VX] <: Map[KX,VX]
,但感觉多余
witness: CC[T] <:< TraversableLike[T,CC[T]]
似乎也是多余的,我的直觉是这是由Traversable
的类型强制执行,并且必须始终保持为真X
的任何可能的子类或值,因此没有理由明确要求它作为证人。
如果我在REPL中使用存在类型测试它,那么编译器似乎同意我的意见:
scala> implicitly[Traversable[X] <:< TraversableLike[X,Traversable[X]] forSome { type X }]
res8: <:<[Traversable[X],scala.collection.TraversableLike[X,Traversable[X]]] forSome { type X } = <function1>
有没有办法取消样板?
答案 0 :(得分:1)
我是Scala noob,所以如果这没有用,请不要把我击倒。
假设:
class MoreFilterOperations[Repr <% TraversableLike[T,Repr], T] (xs: Repr) {}
这样的事情会起作用吗?
// t2fo is short for traversableToFilterOps
implicit def t2fo[Repr <% TraversableLike[T, Repr], T](xs: Repr) =
new MoreFilterOperations[Repr, T](xs)
// m2fo is short for mapToFilterOps
implicit def m2fo[Repr <% Map[K, V] <% TraversableLike[(K,V), Repr], K, V]
(xs: Repr) = new MoreFilterOperations[Repr, (K, V)](xs)
这应该有效,因为(根据我的书...编程Scala,p264)以下方法定义与视图绑定:
def m [A <% B](arglist): R = ...
它实际上与此方法定义相同:
def m [A](arglist)(implicit viewAB: A => B): R = ...