Существуют ли спецификации Clojure, эквивалентные предложениям Вадлера?

Wadler написал удивительную статью: Предложения как типы - где он говорит о Howard-Curry, что вы можете проверить поведение программы с точки зрения типов программы. (Для данного подмножества языков).

Недавно Rich Hickey опубликовал Clojure spec, для определения спецификаций данных и функций.

Здесь комментатор пишет:

от Wadler у нас есть такие реквизиты ≅ типов, спецификации ≅ реквизиты → типы ergo могут выполнять статические спецификации/контракты/проверки типов.

Мой вопрос: Являются ли Clojure спецификациями, эквивалентными предложениям Wadler?

Ответ 1

Определение условий

Предложения как типы конкретно говорят об изоморфизме, существующем между естественным дедукцией и просто типизированным лямбда-исчислением (STLC), двумя формализмами для логики и языков программирования соответственно. Это означает, что когда вы программируете в STLC, вы можете преобразовать свои программы в логическое предложение.

Например, они эквивалентны:

(a -> b) -> a -> b

P implies Q
P
therefore Q

Первая - это сигнатура типа для функции, вторая - логическое предложение. Теперь, когда вы используете "Clojure спецификации, эквивалентные предложениям Wadler?" то, что вы спрашиваете, "можем ли мы преобразовать спецификации Clojure в логические выражения?" или из-за изоморфизма, "можем ли мы преобразовать спецификации Clojure в STLC?"

Отсутствие эквивалентности

Спекуляции позволяют нам использовать любые Clojure predicates. Это делает spec невероятно гибким, но это также ключ к пониманию того, что спецификации не являются предложениями.

Одной из ключевых особенностей, которые делают работу STLC логикой, является то, что все термины сокращаются или, другими словами, все программы в STLC завершаются. Clojure не имеет этого свойства, легко написать Clojure программы, которые никогда не будут завершены. Для того чтобы любой язык программирования являлся последовательной логикой, он должен обладать этим свойством завершения, поскольку "отказ от прерывания" эквивалентен противоречию в логике. Поскольку спецификации могут использовать любую функцию Clojure, вы можете написать спецификацию, которая не заканчивается и, следовательно, не может быть переведена в STLC. Таким образом, спецификации Clojure не эквивалентны предложениям Wadler.

Что другое и что похоже?

Как указано docs из Clojure spec, spec не является системой типов. Спецификации не связаны с доказательством, но существуют типы. Типы ограничивают программы, которые мы можем написать тем, которые могут быть статически доказаны, чтобы "идти вправо". Типовые системы бывают разных уровней мощности и выразительности, но системы звукового типа доказывают определенные свойства вашего кода.

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

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