дыбр

Jul 29, 2012 22:22

И этим все сказано.

Read more... )

Leave a comment

Comments 9

stdray July 29 2012, 20:52:37 UTC
А что
type Ordering[T] = Ordering[T]
делает?

Reply

sassa_nf July 30 2012, 15:40:31 UTC
присваивает значение типа.

в супер классе можно объявить 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

stdray July 30 2012, 18:35:59 UTC
>в супер классе можно объявить type Ordering[T] (без ничего), а в суб-классах присвоить конкретные значения:

Это произвольно выбранное название типа-параметр получается?
То есть в данном случае можно было пересать как

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

sassa_nf July 30 2012, 19:04:54 UTC
я цитируемого кода не видел, в исходном посте только одна строка, но думаю, что да, можно вот так переписать. Совпадение названий не обязательно, но именно здесь могло быть сделано нарочно (типа чтобы из названия class-internal type было примерно ясно для чего он)

что такое rank-2 полиморфизм я не изучал (сорри, TAPL во фьючере :-)), но да, это такой полиморфизм.

Reply


Leave a comment

Up