в супер классе можно объявить type Ordering[T] (без ничего), а в суб-классах присвоить конкретные значения:
class Super{ type Ordering[T] def compare[A](f: Ordering[A]): Boolean }здесь compare объявлен с аргументом абстрактного типа. А вот суб-классы могут задать конкретное значение этого типа:
class Sub extends Super{ type Ordering[T] = Ordering[T] def compare[A](f: Ordering[A]): Boolean = ... }здесь реализация compare с конкретным типом аргумента - другие передать нельзя.
Гораздо более интересны случаи с ограничением типа:
abstract class Super[A]{ type Iter[T] B]): Iter[B] }
class Sub[A](val as: List[A]) extends Super[A] { type Iter[T] = List[T] def map[B](f: List[A=>B]): List[B] = (f zip as) map (p => p._1(p._2)) }
я цитируемого кода не видел, в исходном посте только одна строка, но думаю, что да, можно вот так переписать. Совпадение названий не обязательно, но именно здесь могло быть сделано нарочно (типа чтобы из названия class-internal type было примерно ясно для чего он)
что такое rank-2 полиморфизм я не изучал (сорри, TAPL во фьючере :-)), но да, это такой полиморфизм.
Comments 9
type Ordering[T] = Ordering[T]
делает?
Reply
в супер классе можно объявить type Ordering[T] (без ничего), а в суб-классах присвоить конкретные значения:
class Super{
type Ordering[T]
def compare[A](f: Ordering[A]): Boolean
}здесь compare объявлен с аргументом абстрактного типа. А вот суб-классы могут задать конкретное значение этого типа:
class Sub extends Super{
type Ordering[T] = Ordering[T]
def compare[A](f: Ordering[A]): Boolean = ...
}здесь реализация compare с конкретным типом аргумента - другие передать нельзя.
Гораздо более интересны случаи с ограничением типа:
abstract class Super[A]{
type Iter[T] B]): Iter[B]
}
class Sub[A](val as: List[A]) extends Super[A] {
type Iter[T] = List[T]
def map[B](f: List[A=>B]): List[B] = (f zip as) map (p => p._1(p._2))
}
Reply
Это произвольно выбранное название типа-параметр получается?
То есть в данном случае можно было пересать как
class Super{
type C[T]
def compare[A](f: C[A]): Boolean
}
class Sub extends Super{
type C[T] = Ordering[T]
def compare[A](f: C[A]): Boolean = ...
}
и все продолжит работать? Такой rank-2 полиморфизм?
Reply
что такое rank-2 полиморфизм я не изучал (сорри, TAPL во фьючере :-)), но да, это такой полиморфизм.
Reply
Leave a comment