Система типов в Scala завершена по Тьюрингу. Доказательство? Пример? Выгоды?
Есть утверждения, что система типов Scala является полной по Тьюрингу. Мои вопросы:
Есть ли формальное доказательство этому?
Как будут выглядеть простые вычисления в системе типов Scala?
Это какая-то польза для Scala - языка? Делает ли это Scala более "мощным" в некотором роде по сравнению с языками без полной системы типов Тьюринга?
Я думаю, что это относится к языкам и системам типов в целом.
2 ответа
Где-то есть пост в блоге с реализацией на уровне типов комбинаторного исчисления, которое, как известно, является полным по Тьюрингу.
Системы типа Тьюринга имеют в основном те же преимущества и недостатки, что и языки с тьюринговым набором: вы можете делать что угодно, но вы можете доказать очень мало. В частности, вы не можете доказать, что в конечном итоге вы что-то сделаете.
Одним из примеров вычислений на уровне типов являются новые сохраняющие тип преобразователи коллекций в Scala 2.8. В Scala 2.8 такие методы, как map
, filter
и так далее гарантированно возвращают коллекцию того же типа, к которому они были вызваны. Итак, если вы filter
Set[Int]
вернись Set[Int]
и если вы map
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]
,
Все эти вычисления выполняются во время компиляции или, точнее, во время проверки типа, с использованием функций уровня типа. Таким образом, статически гарантируется безопасность типов, даже если типы фактически вычисляются и, следовательно, не известны во время разработки.
Мой пост в блоге о кодировании исчисления SKI в системе типов Scala показывает полноту по Тьюрингу.
Для некоторых простых вычислений на уровне типов есть также несколько примеров того, как кодировать натуральные числа и сложение / умножение.
Наконец, в блоге Apocalisp есть большая серия статей по программированию на уровне типов.