Система типов в Scala завершена по Тьюрингу. Доказательство? Пример? Выгоды? - PullRequest
53 голосов
/ 29 октября 2010

Есть утверждения, что система типов Scala завершена по Тьюрингу. Мои вопросы:

  1. Есть ли формальное подтверждение этому?

  2. Как будут выглядеть простые вычисления в системе типов Scala?

  3. Это приносит пользу Scala - языку? Делает ли это в некотором роде Scala более «мощным» по сравнению с языками без полной системы типов Тьюринга?

Полагаю, это относится к языкам и системам типов в целом.

Ответы [ 2 ]

36 голосов
/ 29 октября 2010

Где-то есть сообщение в блоге с реализацией на уровне типов комбинаторного исчисления, которое, как известно, является полным по Тьюрингу.

Системы типа полного по Тьюрингу имеют в основном те же преимущества и недостатки, что и Тьюринг.-полные языки есть: вы можете делать что угодно, но вы можете доказать очень мало.В частности, вы не можете доказать, что на самом деле что-то сделаете.

Одним из примеров вычислений на уровне типов являются новые сохраняющие тип преобразователи коллекций в Scala 2.8.В Scala 2.8 такие методы, как map, filter и т. Д. Гарантированно возвращают коллекцию того же типа, к которому они были вызваны.Итак, если вы filter a Set[Int], вы получите обратно Set[Int], а если вы map a List[String], вы получите List[Whatever the return type of the anonymous function is].

Теперь, как вы можете видеть,map действительно может преобразовать тип элемента.Итак, что произойдет, если новый тип элемента не может быть представлен с исходным типом коллекции?Пример: BitSet может содержать только целые числа фиксированной ширины.Итак, что произойдет, если у вас есть BitSet[Short], и вы сопоставляете каждое число с его строковым представлением?

someBitSet map { _.toString() }

Результат будет равным BitSet[String], но это невозможно.Итак, Scala выбирает самый производный супертип BitSet, который может содержать String, который в данном случае равен Set[String].

Все эти вычисления выполняются во время времени компиляции или точнее во время проверки типа с использованием функций уровня типа.Таким образом, статически гарантируется безопасность типов, даже если типы фактически вычисляются и, следовательно, не известны во время разработки.

34 голосов
/ 29 октября 2010

Мой блог о кодировании исчисления SKI в системе типов Scala показывает полноту по Тьюрингу.

Для некоторых простых вычислений на уровне типов есть также несколько примеров того, как кодировать натуральные числа и сложение / умножение .

Наконец, в блоге Apocalisp есть большая серия статей о программировании на уровне типов.

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