LINUX.ORG.RU

Есть ли в CL и C алгебраические типы данных?

 , ,


0

2

Вот я читаю Википедию: алгебраический тип данных - это сумма произведений типов. ГДе произведением почему-то называется рекорд из таких типов.

Ну так и что? В С объявляем юнион из структур с тегом. В лиспе - несколько структур и or.

Конструкторы и сопоставление с образцом - это уже лирика (утилиты, так скажем). Верно я понимаю определение АТД или нет?

★★★★★
Ответ на: комментарий от anonymous

Обязательно, конечно же.

Просто наглая нелепая ложь!

Что за бред? У чекера нету никакой информации, которой не было бы в рантайме.

Не так. У тайпчекера есть информация про типы, которой нету в языках с динамической типизацией ни на этапе компиляции, ни во время исполнения.

Это выполняет рантайм за тебя в случае рантайм-ошибки - он сразу показывает где и что, ничего дополнительно разбирать не надо. А вот в случае ошибки чекера тебе придется по всем вызовам идти и искать, в чем дело.

Нет, с динамической типизацией тебе придется бектрейсить по вызовам, чтобы найти проблему. И даже в этом случае ты можешь её не найти. Тайпчекер сразу же, как только выдаст ошибку, укажет тебе все, что нужно знать для решения проблемы.

Waterlaz ★★★★★
()
Ответ на: комментарий от Waterlaz

Не так. У тайпчекера есть информация про типы, которой нету в языках с динамической типизацией ни на этапе компиляции, ни во время исполнения.

В момент броска ошибки рантайм таки уже знает типы значений. Единственное, что он может не хранить часть данных, которые использовались для задания этих типов.

anonymous
()
Ответ на: комментарий от Waterlaz

Просто наглая нелепая ложь!

Что, прости? Каким образом это может быть не так? Мы о рантайме, напоминаю. Как то место, в котором программа отвалилась, может не быть тем местом, в котором программа отвалилась?

Не так. У тайпчекера есть информация про типы, которой нету в языках с динамической типизацией ни на этапе компиляции, ни во время исполнения.

Это так при слабой типизации. При сильной типизации рантайм имеет строго большую информацию о типах, чем тайпчекер.

Нет, с динамической типизацией тебе придется бектрейсить по вызовам, чтобы найти проблему.

Зачем? Ни разу не встречал такого.

Тайпчекер сразу же, как только выдаст ошибку, укажет тебе все, что нужно знать для решения проблемы.

Чекер в отличии от рантайма вообще не может сказать ничего об ошибке. Он говорит о несоответствии типов или о невозможности вывода, и это все, никакой другой информации у него нет by design, это рантайм знает об исполнении, чекер знает только о типах. Несоответствии типов в случае типов сложнее простейших мономорфных и часто ничего не говорит о характере ошибки. В случае вывода типов - местоположение факапа может быть вообще где угодно и не говорит ничего о местоположении ошибки.

anonymous
()
Ответ на: комментарий от anonymous

Что, прости? Каким образом это может быть не так? Мы о рантайме, напоминаю. Как то место, в котором программа отвалилась, может не быть тем местом, в котором программа отвалилась?

Точно так же, как тайпчекер указывает место, «на котором у него не получилось», точно так же в рантайме все свалится, когда мы попытаемся сложить число со строкой, грубо говоря.

Чекер в отличии от рантайма вообще не может сказать ничего об ошибке.

Чекер выдает _полную_ информацию, почему не получилось вывести тип. В рантайме ты лишь получишь «начальник, не получилось».

Он говорит о несоответствии типов или о невозможности вывода, и это все, никакой другой информации у него нет by design, это рантайм знает об исполнении, чекер знает только о типах.

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

В случае вывода типов - местоположение факапа может быть вообще где угодно и не говорит ничего о местоположении ошибки.

Не совсем где угодно. Аннотация типов очень сильно ограничивает это дело.

Waterlaz ★★★★★
()
Ответ на: комментарий от Waterlaz

Чекер выдает _полную_ информацию, почему не получилось вывести тип.

Во-первых не выдаст, он только скжает что вывести не получилось. Во-вторых - это не имеет никакого отношения к ошибке, потому что типы могут быть не те и вообще совсем другой терм за 1000 строк от нужного.

Точно так же, как тайпчекер указывает место, «на котором у него не получилось», точно так же в рантайме все свалится, когда мы попытаемся сложить число со строкой, грубо говоря.

Именно. Рантайм выдает место ошибки, а чекер - место, где у него не получилось. Которое может быть сколь угодно далеко от места ошибки.

Сюрприз, но что тебе еще надо знать, кроме _типов_, для отлавливания ошибок _типизации_?

Если ты мономорфные, то ничего, конечно же (хотели строку, получили число). Но они ведь бывают и сложнее.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.