Потому что то, что справа от двоеточия, не обязательно является набором, а то, что слева от двоеточия, не обязательно является членом этого множества.
Теория типов началась в начале 20-го века как подход к основанию математики. Бертран Рассел обнаружил парадокс в наивной теории множеств, и он работал над теорией типов как способом ограничить выразительную силу теории множеств, чтобы избежать этого (и любого другого) парадокса. За прошедшие годы Рассел и другие определили множество теорий типов. В некоторых теориях типов типы - это наборы с определенными свойствами, но в других - это другой тип зверя.
В частности, многие теории типов имеют синтаксическую формулировку. Есть правила, которые заставляют вещь иметь тип. Когда правила печатания используются в качестве основы для теории, важно отличать то, что говорят правила печатания, от того, что можно вывести, применяя дополнительные внешние знания. Это особенно важно, если правила типизации являются основой для теории доказательств: теоремы, которые основаны на теории множеств с классической логикой и аксиомой выбора, могут, например, быть или не быть в конструктивной логике. Одна из основополагающих работ в этой области - « Формулировка простой теории типов» Черча (1940)
Возможно, способ, которым различие между типами и наборами является наиболее очевидным, состоит в том, что самое основное правило для наборов, а именно, что два набора равны, если они имеют одинаковые элементы, обычно не применяется к типам. См . Ответ Андрея Бауэра здесь и его ответ на связанный вопрос для некоторых примеров. Эта вторая тема имеет другие ответы, которые стоит прочитать.
В типизированном исчислении сказать, что типы являются множествами, фактически дать семантику типам. Дать исчисление теоретико-типовой семантики нетривиально. Например, предположим, что вы определяете язык с помощью функций. Какой набор является типом функции? Полные функции определяются их графом, как нас учат в теории множеств 101. Но как насчет частичных функций? Хотите ли вы дать всем не завершающим функциям одинаковую семантику? Вы не можете интерпретировать типы как наборы для исчисления, которое допускает рекурсивные функции, пока вы не ответите на этот вопрос. Придание денотативной семантики языкам программирования или исчисления было трудной проблемой в начале 1970-х годов. Основным документом здесь является На пути к математической семантики для компьютерных языков (1971) поДана Скотт и Кристофер Стрейчи . В Haskell wikibook есть хорошая презентация темы.
Как я писал выше, вторая часть ответа заключается в том, что даже если вам удалось дать типам теоретико-множественную семантику, вещь слева от двоеточия не всегда является элементом множества. Значения имеют типы, но также и другие вещи, такие как выражения и переменные . Например, выражение в типизированном языке программирования имеет тип, даже если оно не заканчивается. Вы можете быть готовы приравнивать integer
и Z , но (x := 0; while true; do x := x + 1; x)
это не является элементом Z .
Я не знаю, когда возникли обозначения двоеточия для типов. Теперь он стандартен в семантике и распространен в языках программирования, но ни Рассел, ни Черч не использовали его. Алгол не использовал его, но в значительной степени вдохновленный Алголом язык, который Паскаль использовал в 1971 году. Я подозреваю, что он был не первым, хотя во многих теоретических работах начала 1970-х годов используется обозначение, но я не знаю ранее использовать. Интересно, что это произошло вскоре после того, как концепции типов из программирования и логики были объединены - как показывает Саймон Мартини в книге «Несколько типов типов в языках программирования» , то, что до 1960-х годов называлось «типом» в языках программирования, пришло из народного языка. Использование слова, а не из теории типов.