Scala просматривать границы, которые работают с подтипами? - PullRequest
5 голосов
/ 20 октября 2011

Есть ли в Scala что-то похожее на границы вида, но которые могут соответствовать подтипам?

Поскольку представления в Scala не объединяются, в настоящее время у меня есть следующее:

implicit def pimpIterable[A, I[_]](x: I[A])(implicit f: I[A] => Iterable[A]) =
  new { def mylength = x.size }

Позвольте мне написать:

Array(1,2,3).mylength
Seq(1,2,3).mylength

Представленная выше форма представляется необходимой, поскольку, если я попытаюсь упростить сигнатуру своей функции с помощью чего-то вроде:

implicit def pimpIterable[A, I <% Iterable[A]](x: I) =
  new { def mylength = x.size }

тогда неявное преобразование не будет работать для массивов, поскольку нет прямого представления массива в Iterable (только для подкласса Iterable, который может найти первая форма).

Это также приводит к тому, что все другие короткие руки также записываются в полной форме. Что могло бы быть:

implicit def pimpIterable[A: Scalar, I <% Iterable[A]](x: I) = ...

теперь должно быть записано как:

implicit def pimpIterable[A, I[_]](x: I[A])(implicit f: I[A] => Iterable[A], m: Scalar[A]) = ...

Есть ли лучший путь?

1 Ответ

0 голосов
/ 31 октября 2011

Есть две проблемы с подписью вида.Во-первых, Iterable не имеет length, только size.Далее, I не является типом-созидателем.Итак, исправляя оба, подпись:

implicit def pimpIterable[A, I <% Iterable[A]](x: I) = new { def mylength = x.size }

Это правильно.Если вы параметризуете I, это исключит такие типы, как BitSet и String.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...