2017-02-11 17 views
1

(Scala 2.11.8)типа Scala умозаключение и несколько аргументов список

Рассмотрим следующий код:

trait Class[A] { 
    def f1[B >: A](arg1: Int)(ord: Ordering[B]): Int 

    def f2[B >: A](arg1: Int, ord: Ordering[B]): Int 

    def f[B >: A](ord: Ordering[B]): Int = { 
    f1(123)(ord) // Compilation error! 
    f2(123, ord) // OK 
    } 
} 

Здесь линия f1(123)(ord) поднимает type mismatch; found : Ordering[B] required: Ordering[A] Note: B >: A, but trait Ordering is invariant in type T. You may wish to investigate a wildcard type such as _ >: A. (SLS 3.2.10)

Если мы изменим вызов f1[B](123)(ord), ошибка исчезает.

Почему наличие списка нескольких аргументов приводит к смущению typechecker? Является ли это ошибкой или ожидаемым результатом?

ответ

4

Это не ошибка - разделение в списки параметров означает, что параметр типа выводится на основе первого только список аргумента:

f1(123)(ord) 

можно переписать в виде:

val partiallyApplied = f1(123) 
partiallyApplied(ord) 

Теперь - что такое partiallyApplied? Поскольку параметр типа не был явно установлен, и для использования для вывода нет аргумента/типа возвращаемого значения, параметром типа считается A (пока нет конкретного B! Так что partiallyApplied имеет тип (Ordering[A]) => Int), поэтому его использование с Ordering[B] позже дает исключение.

В отличие от этого, при вызове:

f2(123, ord) 

ord С имеет тип Ordering[B], параметр типа может быть выведен B, поэтому компиляция завершается успешно.

 Смежные вопросы

  • Нет связанных вопросов^_^