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