Scala/Поліморфізм конструктора типу

Матеріал з Вікіпідручника
Перейти до навігації Перейти до пошуку

Починаючи з версії 2.5, Scala підтримує поліморфізм конструктора типу (type constructor polymorphism). Це означає, що параметри типу, можуть самі мати параметри типу. Крім того, аргументи цих конструкторів типів можуть бути обмежені. Scala є першою практичною мовою, щоб об'єднала типи вищого виду (higher-kinded types) і підтипи.

  trait Iterable[T] {
   def filter(p: T => Boolean): Iterable[T]
   def remove(p: T => Boolean): Iterable[T] = filter (x => !p(x))
 }
 
 trait List[T] extends Iterable[T] {
   def filter(p: T => Boolean): List[T] 
   override def remove(p: T => Boolean): List[T] 
     = filter (x => !p(x))
 }

Визначення тип вертаємого значення приводить до дублювання коду у List

Той самий код із поліморфізмом конструктора типу

 trait Iterable[T, Container[X]] {
   def filter(p: T => Boolean): Container[T]
   def remove(p: T => Boolean): Container[T] = filter (x => !p(x))
 }
 
 trait List[T] extends Iterable[T, List]

Джерело[ред.]