Можно ли это упростить? - PullRequest
4 голосов
/ 18 февраля 2011

Обращаясь к моему предыдущему ответу на 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. 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>

Есть ли поэтому какой-нибудь способ покончить с шаблоном?

1 Ответ

1 голос
/ 20 февраля 2011

Я Scoo 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 = ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...