Я думал, что правильно понял зависимую типизацию (DT), но ответ на этот вопрос: /cstheory/30651/why-was-there-a-need-for-martin-l%C3% Теория типа «создать творческий интуиционизм» заставила меня думать иначе.
После прочтения DT и попыток понять, что они из себя представляют, я пытаюсь задаться вопросом, что мы получаем от этого понятия DT? Они кажутся более гибкими и мощными, чем просто типизированное лямбда-исчисление (STLC), хотя я не могу точно понять, «как / почему».
Что мы можем сделать с DT, что нельзя сделать с STLC? Похоже, добавление DT делает теорию более сложной, но в чем выгода?
Из ответа на поставленный выше вопрос:
Зависимые типы были предложены де Брюйном и Говардом, которые хотели расширить соответствие Карри-Говарда от логики высказываний до логики первого порядка.
Кажется, на каком-то уровне это имеет смысл, но я все еще не могу понять общую картину «как / почему»? Может быть, пример, явно показывающий, что это расширение соответствия CH логике FO могло бы помочь понять, в чем заключается проблема с DT? Я не уверен, что понимаю это так же хорошо, как должен.
источник
Ответы:
Расширяю мой комментарий: Зависимые типы могут набирать больше программ. «Больше» просто означает, что набор программ, типизируемых с зависимыми типами, является правильным надмножеством программ, типизируемых в простом типе калькуляции (STLC). Примером может быть L i s t 2 ∗ 3 + 4 ( α ) , списки длиной 10 , содержащие элементы типа α . Выражение 2 ∗ 3 + 4 является одновременно программой и частью типа. Вы не можете сделать это в STLC.λ List2∗3+4(α) 10 α 2∗3+4
Ключевое правило, которое отличает зависимые от не зависимых типов - это приложение:
Слева у вас есть STLC, где программы в помещении «перетекают» только в программу заключения. Напротив, в правиле зависимого приложения справа программа из правой предпосылки «перетекает» в тип в заключении .1N 1
Чтобы иметь возможность параметризовать типы с помощью программ, синтаксис зависимых типов должен быть более богатым, и чтобы гарантировать, что типы правильно сформированы, мы используем вторую «систему типизации», называемую видами, которая ограничивает типы. Эта система сортировки по сути является STLC, но «на один уровень выше».
Есть много объяснений зависимых типов. Несколько примеров.
источник
Думайте о объявлениях типа как о не более чем утверждениях. В настоящее время все, что вы можете сказать, это такие вещи, как isInt32 (), isCharPtr () и т. Д. Эти различные утверждения выбираются для проверки во время компиляции. Но эта концепция может быть расширена до таких вещей, как: isCharPtr () && isNotNull (). Обнуляемые указатели - огромная проблема. Указатели не должны быть обнуляемыми в качестве позиции по умолчанию, причем обнуляемые указатели являются типом, который не может быть разыменован, не зная, является ли он нулевым или нет. Подобные проблемы, такие как: isPositiveInteger () или isEvenNaturalNumber ().
источник