2016-10-15 6 views
0

Тип ограничения реализованы в виде следующих типов:Почему компилятор scala не выводит тип параметра доказательства?

abstract class <:<[-From, +To] extends Function1[From, To] 
    object <:< { 
    implicit def conforms[A] = new (A <:< A) { def apply(x: A) = x } 
    } 

мы используем доказательства в нашем коде, как это:

def firstLast[A, C](it: C)(implicit ev: C <:< Iterable[A]) = 
(it.head, it.last) 

когда я очистить apply метод компилятор говорит, что it не содержит head и last, в то время как неявное разрешение типа уже было успешным. Это означает, что C является подтипом Iterable [A]. Но компилятор не может этого сделать. Это только то, что вывод типа Scala недостаточно мощный?

+0

Какой код создает ошибку, которую вы описываете? Сначала краснеть, похоже, работает по назначению. –

+0

'<: <' является оператором по умолчанию, доступным в Scala, почему вы собираетесь настраивать btw> – flavian

+1

Не говорите мне, что вы говорите об ошибках, данных некоторыми IDE, такими как eclipse или intellij, а не самим компилятором Scala? –

ответ

0

Я не понимаю ... что вы считаете неправильным с этим. Он работает нормально,

scala> :pa 
// Entering paste mode (ctrl-D to finish) 

def firstLast[A, C](it: C)(implicit ev: C <:< Iterable[A]) = (it.head, it.last) 

// Exiting paste mode, now interpreting. 

firstLast: [A, C](it: C)(implicit ev: <:<[C,Iterable[A]])(A, A) 

scala> firstLast(List(1,2,3)) 
res0: (Int, Int) = (1,3) 
Смежные вопросы