Да, основная концепция применяется повсеместно, да, но редко полезным способом.
Начнем с того, что с точки зрения теории типов это предполагает, что «динамические» языки лучше всего рассматривать как имеющие один тип, который содержит (среди прочего) метаданные о природе значения, которое видит программист, включая то, что эти динамические языки будут называть сами по себе "тип" (что не является концептуально одним и тем же). Любые такие доказательства, вероятно, будут неинтересны, поэтому эта концепция в основном относится к языкам со статическими системами типов.
Кроме того, многие языки, которые предположительно имеют «статическую систему типов», должны рассматриваться как динамические на практике, в этом контексте, поскольку они допускают проверку и преобразование типов во время выполнения. В частности, это означает любой язык со встроенной, по умолчанию поддержкой «отражения» или тому подобное. C #, например.
Haskell необычен в том, сколько информации он ожидает от типа - в частности, функции не могут зависеть ни от каких значений, кроме тех, которые указаны в качестве аргументов. С другой стороны, в языке с изменяемыми глобальными переменными любая функция может (потенциально) проверять эти значения и соответственно изменять поведение. Таким образом, функцию Haskell с типом A -> B
можно рассматривать как миниатюрную программу, доказывающую, что это A
подразумевает B
; эквивалентная функция во многих других языках только скажет нам, что A
и какое бы глобальное состояние ни находилось в области видимости, подразумевается B
.
Обратите внимание, что хотя Haskell поддерживает такие вещи, как отражение и динамические типы, использование таких функций должно указываться в сигнатуре типа функции; аналогично для использования глобального государства. Ни один не доступен по умолчанию.
В Haskell также есть способы сломать вещи, например, разрешить исключения во время выполнения или использовать нестандартные примитивные операции, предоставляемые компилятором, но те ожидают, что они будут использоваться с полным пониманием только теми способами, которые победили. повредить смысл внешнего кода. Теоретически то же самое можно сказать и о других языках, но на практике с большинством других языков труднее выполнять задачи без «мошенничества» и менее навязчиво «обманывать». И, конечно, в настоящих «динамических» языках все это не имеет значения.
Концепция может быть взята гораздо дальше, чем в Хаскеле.