Страничка семинара теории типов: различия между версиями

Материал из Вики проекта PascalABC.NET
Перейти к навигацииПерейти к поиску
Строка 34: Строка 34:
''Juliet:''
''Juliet:''


16 страниц. Дженерики высшего сорта, чистая правда!
16 страниц. Название обещает дженерики высшего сорта!
 
Во-первых, надо признаться, что у меня разрыв шаблона. Когда я смотрю на Scala-код в статье, я совершенно перестаю понимать, где здесь концепты, а где классы. Насколько я понимаю, концептов в том смысле, как мы уже привыкли их воспринимать, здесь нет. Сплошные классы.
 
Точнее, есть '''trait''' и '''class'''. Из статьи: класс может наследоваться от другого класса и нескольких траитов. Траит это класс, который может комбинироваться с другими траитами с помощью некой ограниченной версии множественного наследования.
 
Далее говорится, что в статье разница между траитами и классами не так важна, так что все называется классами.
 
Класс может быть параметризован. А может содержать абстрактный тип-член. И они вроде бы ничем по сути не отличаются кроме области видимости.
 
Соль типов-параметров шаблона в том, что в качестве параметра может быть не конкретный тип, а '''конструктор типа'''.
 
<source lang="Scala">
trait Iterable[T, Container[X]] {
  def filter(p: T => Boolean): Container[T]
  ...
}
</source>
 
Это означает, что первый параметр — конкретный тип, а второй параметр — конструктор типа от одного параметра. И далее можем написать так:
 
<source lang="Scala">
trait List[T] extends Iterable[T, List]
</source>

Версия от 21:34, 31 января 2013

По концептам, типам следует читать современные статьи

Можно начинать со школы Одерского:

Статьи по теоретическим основам языка Скала

Выделю тут ряд статей, с которых, по моему мнению, следует начинать:

Краткий отчет о статьях

Compiling Generics Through User-Directed Type Specialization

Juliet:

Небольшая статья, 6 страниц. О технических особенностях генерации кода для шаблонов.

В двух словах речь о том, что использовать код, который генерируется для шаблона после стирания типов (где вместо типа T возникает Object) неэффективно для примитивных типов. Так как их приходится заворачивать в классы-обертки, и, соответственно, в специализированной версии возникают лишние операции boxing/unboxing.

В качестве альтернативы при описании шаблона для типа-параметра шаблона можно указать ключевое слово specialized:

def someFun[@specialized T](...

В этом случае помимо кода с Object будут сгенерированы специализации для примитивных типов.

Generics of a Higher Kind

Juliet:

16 страниц. Название обещает дженерики высшего сорта!

Во-первых, надо признаться, что у меня разрыв шаблона. Когда я смотрю на Scala-код в статье, я совершенно перестаю понимать, где здесь концепты, а где классы. Насколько я понимаю, концептов в том смысле, как мы уже привыкли их воспринимать, здесь нет. Сплошные классы.

Точнее, есть trait и class. Из статьи: класс может наследоваться от другого класса и нескольких траитов. Траит это класс, который может комбинироваться с другими траитами с помощью некой ограниченной версии множественного наследования.

Далее говорится, что в статье разница между траитами и классами не так важна, так что все называется классами.

Класс может быть параметризован. А может содержать абстрактный тип-член. И они вроде бы ничем по сути не отличаются кроме области видимости.

Соль типов-параметров шаблона в том, что в качестве параметра может быть не конкретный тип, а конструктор типа.

trait Iterable[T, Container[X]] {
  def filter(p: T => Boolean): Container[T]
  ...
}

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

trait List[T] extends Iterable[T, List]