这可以简化吗?

时间:2011-02-18 09:20:18

标签: scala types

参考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)

有两个问题:

  1. 有没有办法给编译器一个Map符合签名CC[X] <: Traversable[X]的提示? 我希望它匹配为Traversable[Tuple2[_,_]],但这不会发生。最后,我不得不写第二个方法CC[KX,VX] <: Map[KX,VX],但感觉多余

  2. 鉴于第一个类型参数,
  3. witness: CC[T] <:< TraversableLike[T,CC[T]]似乎也是多余的,我的直觉是这是由Traversable的类型强制执行,并且必须始终保持为真X的任何可能的子类或值,因此没有理由明确要求它作为证人。

  4. 如果我在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>
    

    有没有办法取消样板?

1 个答案:

答案 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 = ...