Основное исчисление в системе типов скала (рекурсия) - PullRequest
6 голосов
/ 20 февраля 2011

Как Typer в компиляторе scala проверяет следующее:

class D[T <: D[T]]
class E extends D[E]

Верхняя граница D [T] параметра типа класса D должна быть совместима с E. Тип E не эквивалентен D,поэтому будет проверен его базовый тип D.Поскольку конструкторы типа базового типа E и D равны, границы должны быть проверены.И вот идет рекурсия. Базовое исчисление не справляется с этим.

Ответы [ 2 ]

4 голосов
/ 21 февраля 2011

1) Начните с

E extends D[E]

2) Расширение подразумевает подтип в Scala, поэтому

E <: D[E]        

3) Из-за определения «класс D [T <: D [T]]» требование к T для любого D [T] состоит в том, что T <: D [T]. Шаг 2 сказал, что E должен иметь возможность быть подключенным к T, чтобы он лучше соответствовал этому требованию. Подставляя E для T, мы получаем требование, что </p>

E <: D[E]

Мы уже показали E <: D [E] в шаге 2. Мы закончили. </p>

3 голосов
/ 20 февраля 2011

Реального ответа нет, только два замечания: этот шаблон известен как CRTP , и он также работает в Java (см. java.lang.Enum)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...