Твердое обсуждение языкового дизайна - ковариантный и контравариантный типы
Под обсуждением я подразумеваю запись в блоге, книгу (желательно) или подобное.
Фон
Я во второй раз читаю Scala Programming Мартина Одерского, Лекса Спуна и Билла Веннерса, и с большим удивлением прочитал статьи о ковариации и контравариантности.
Причина, по которой я задаю этот вопрос, заключается в следующем: авторы начинают с построения класса Queue и обсуждают, как, где, можно и нельзя использовать ковариацию. Каждый шаг является логическим результатом предыдущего шага, однако одним из последних шагов является добавление элемента в очередь (впереди):
(elem : Apple) :: (queue[Orange])
Однако в Scala это работает так, что результатом является очередь с типом Fruit.
И это, на мой взгляд, неправильно - если кому-то нужна очередь с фруктами, то это должна быть такая очередь, в первую очередь. Изменение типа на лету слишком динамично для моего вкуса (то есть это как добавление целых и строк, просто чтобы получить object
тип).
Поскольку упомянутая книга о Scala, а дисперсия типов - лишь часть этого, я ищу что-то более существенное.
Вопрос
Таким образом, вопрос - что я должен прочитать о дизайне языка, ориентированном на дисперсию типов? Может ли это быть случайно "Типы и языки программирования" Бенджамина С. Пирса (он в моем списке покупок)?
1 ответ
Википедия ковариации и контравариантности несколько полезна. В общем, ковариация и контравариантность - это довольно крутые аспекты, и они имеют некоторые глубокие последствия для понимания языков программирования, но я не уверен, насколько полезно знать об их внутренней работе как программиста. Новаторская работа в этой области была сделана Лисковым (известным по принципу замещения Лискова). Есть также хорошая статья Джона Кука, которую вы можете прочитать! Вы можете прочитать несколько классных научных статей, а именно: "Семантика множественного наследования" (Лука Карделли, который также написал очень хорошую книгу, которую я не совсем прочитал, "Теория объектов"), охватывающую подобные вещи в семантика объектно-ориентированных языков.) Я полагаю, что статья, в которой впервые упоминается ко / противо-дисперсия в языках программирования, является собственно "поведенческим понятием подтипирования" Лискова. Хотя я давно этого не читал, в статье рассказывается о теории не только типов функций, но и предикатов типов (и это дает гораздо более общее описание того, как система типов работает с этими общими принципами)., Наконец, на случай, если слайды - ваша вещь, Джефф Фостер (и я, как ТА) преподаю курс компиляторов в UMD в этом семестре, и у него есть несколько отличных слайдов по системам типов!
Чтобы сделать небольшой комментарий, дизайн языка программирования - намного, намного большая область, чем эта разница, которую Вы находите. Если вы начнете читать TAPL Бена Пирса, вы легко отвлечетесь от большинства других тем в книге, что тоже хорошо. Co и контрвариантность - это круто, но я думаю, что есть много других не менее крутых вещей, которые вы найдете в теории языка программирования, и это поражает меня от самой удивительной вещи:-)