2014-09-30 3 views
1

У меня возникают проблемы с ограничениями зрения. Я написал следующую функцию, которая должна взять любой объект seq в качестве Seq[T] и вернуть None, если он пуст, или Some(seq) в противном случае.Неявное преобразование в Seq [T] из массива [T]

def noneIfEmpty[T, S <% Seq[T]](seq: S): Option[S] = 
    if (seq.isEmpty) None else Some(seq) 

Определим функцию ...

scala> def noneIfEmpty[T, S <% Seq[T]](seq: S): Option[S] = ... 
noneIfEmpty: [T, S](seq: S)(implicit evidence$1: S => scala.collection.immutable.Seq[T])Option[S] 

Хорошо, функция подписи выглядит правильно. Попробуем пустой список ...

scala> noneIfEmpty(List()) 
res54: Option[List[Nothing]] = None 

Пока все хорошо. Теперь давайте попробуем непустой список ...

scala> noneIfEmpty(List(1,2,3)) 
res55: Option[List[Int]] = Some(List(1, 2, 3)) 

Отлично. Как насчет массива?

scala> noneIfEmpty(Array()) 
<console>:15: error: No implicit view available from Array[Nothing] => scala.collection.immutable.Seq[Any]. 
       noneIfEmpty(Array()) 
         ^

Не так уж и много. Что тут происходит? Нет ли неявного преобразования от Array[T] до WrappedArray[T]? Не должно scala.Predef.wrapRefArray позаботиться об этом?

+0

Работает для меня в консоли 2.11.2. – Ashalynd

+0

То же самое, какую версию scala вы используете? –

+1

Это работает, когда это просто 'scala.collection.Seq', но не для' scala.collection.immutable.Seq', как в исходном сообщении. Я не думаю, что есть представление из 'Array [T]' в 'scala.collection.immutable.Seq [T]' ... –

ответ

3

У вас есть импорт scala.collection.immutable.Seq?

Есть ряд неявный вид имени *ArrayOps определены в scala.Predef, которые преобразуют Array[T] в scala.collection.mutable.ArrayOps[T], но не immutable.Seq.

scala> def noneIfEmpty[S <% collection.Seq[_]](seq: S): Option[S] = 
    | if(seq.isEmpty) None else Some(seq) 
noneIfEmpty: [S](seq: S)(implicit evidence$1: S => Seq[_])Option[S] 

scala> noneIfEmpty(Array[Int]()) 
res0: Option[Array[Int]] = None 

scala> noneIfEmpty(Array[Int](1, 2, 3)) 
res1: Option[Array[Int]] = Some([[email protected]) 
Смежные вопросы