2014-02-07 4 views
0

В сигнатуру метода для GroupBy:Как этот параметр типа «набирается»?

def groupBy[K](f : (A) => K) : Map[K, This] 

Как параметр типа [K] на GroupBy наберется? Каково значение [k] в этом контексте: groupBy [K]. Почему здесь требуется параметр типа, это требование Scala, которое не может использовать вместо этого: def groupBy(f : (A) => K) : Map[K, This]?

ответ

2
How is the type parameter of [K] on groupBy typed ? 

От типа функции передается groupBy, если они не переданы явно ,

What is the significance of [k] in this context : groupBy[K] . 

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

Why is the type parameter required here, is this a requirement of Scala that cannot use instead : `def groupBy(f : (A) => K) : Map[K, This]` ? 

Это требование. В определении, которое вы предоставляете, функция, переданная в groupBy, должна быть от A (параметр типа класса) до K, фиксированного типа, известного в определении groupBy. Поскольку в Scala нет типа K, это автоматически приведет к ошибке.

Или, иначе говоря, это будет как определение groupBy как def groupBy(f: (A) => String): Map[String, This].

+0

"должен быть от A (параметр типа класса)", вы говорите, что тип A является типом класса, в котором содержится метод groupBy? –

+1

@Adrian Я бы не сказал этого так, но если я понимаю, что вы говорите правильно, да. 'A' - это параметр типа конкретного экземпляра класса, в котором находится' groupBy'. Итак, если это 'List [String]', то 'A' является' String'. –

1

K - это тип типа уровня метода, для класса не существует. поэтому то, что вы предлагаете, не имеет смысла. K должен быть объявлен как параметр типа также, потому что я предполагаю, что вы не хотите, чтобы ссылаться на тип K, а тип переменной К.

+3

Чтобы уточнить, 'groupBy [K]' объявляет параметр типа 'K', на который ссылаются типы (конструкторы типов)' (A) => K' (что является сахаром для 'Function1 [A, K]') и 'Map [K, This]'. Без объявления 'K' в качестве параметра типа,' K' будет ссылаться на тип во внешней области так же, как 'Map' или' Int'. В этом случае при типичном использовании тип 'K' выводится из возвращаемого типа предоставленного' (A) => K' - селектора клавиш карты. –

0

Список определен в scaladoc как sealed abstract class List[+A] - так что A - это тип элементов в списке. Вы можете группировать элементы списка любой функцией f: (A) ⇒ K, что означает, что K может быть любым типом. Если вы собираетесь уведомить компилятор, который вы можете группировать по «функции f: (A) ⇒ K, где K - некоторый тип», вам нужно объявить символ K. Это делается на уровне метода, поскольку K используется только на уровне метода , Это достигается путем объявления def groupBy[K](f: (A) ⇒ K): Map[K, List[A]]. Надеюсь, это понятно.

0

K определяется первым, поскольку тип функции KeySelector, (A) => K и тип результата: Map [K, this] зависят от его определения. K - это параметр типа, который позволяет реализовать реализацию groupBy при группировке с помощью ключа любого типа.

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