LINUX.ORG.RU

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

 , ,


0

2

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

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

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

★★★★★

Про лисп не знаю. Про C все верно, правда, вся силища именно в образцовости, потому про C-шные union-ы такой восторженности не встречается.

http://www.nsu.ru/xmlui/bitstream/nsu/8874/1/Harrison.pdf ,стр. 68: «Этот тип данных аналогичен конструкции union языка C» .

И вообще, книжка хорошая. Вторую часть, что про ML, читать и интересно, и полезно.

anonymous
()

Протестую! Треды типа «Ну и что, что в X есть Y? Оно нах не надо» - единоличная прерогатива анонiмуса :)

ovk48 ★★★
()

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

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

если это анонiмус, то как он набил три звезды? Может он просто угнал аккаунт?

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

Кстати где он? Я скучаю. Даже Хьюита всего пересмотрел и на смолтолке пару хеловордом написал.

anonymous
()

таки да, одно дело 'технически что-то подобное есть', но на практике никому лучше от этого не становится потому что за использование нестандартных приёмов в рамках технологии оторвут руки

Debasher ★★★★★
()

В лиспе - несколько структур и or.

а проверка на этапе компиляции? без неё всё теряет смысл

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

По-моему, автору это нафиг не нужно. Но у меня просто шаблон, генерирующий тот самый union с тегом.

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

Лисп кое-что может проверять с or-ами. Орально, так сказать. А я не вбрасываю, я доклад пишу :)

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

уже почти страница игнор листа из-за него :)

Debasher ★★★★★
()

произведением почему-то называется
почему-то

Facepalm.

anonymous
()

ГДе произведением почему-то называется рекорд из таких типов.

Сумма - это размеченное объединение, а не обычное.

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

В общем-то всем спасибо.

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

эта идея важна, если ты кодишь на хашкеле

Путаешь просто алгебраические типы данных (record в хаскеле) и обобщенные алгебраические типы данных (GADT). Последние в хаскеле, действительно, сила.

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

алгебраические типы данных (record в хаскеле)

Здесь сказал бред, record не относятся к ADT.

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

просто алгебраические типы данных (record в хаскеле)

data

ovk48 ★★★
()

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

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

Просто некоторые упорыши типами называют не сами типы, а то как их компейлятор проверяет

А другие упорыши считают, что типы существуют, даже если компилятор о них ничего не знает. У этих упорков есть все мыслимые системы типизации - от динамической до зависимых типов. Правда, на практике толку от этого нет, но упоротых это не волнует.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Правда, на практике толку от этого нет

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

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

Говорить такое может только идиот

Ты обиделся за товарища чтоли?

ведь ошибка в рантайме чуть менее чем всегда лучше неправильного результата.

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

Ошибка в рантайме, конечно, лучше, чем неправильный результат. А ошибка при компиляции лучше ошибки в рантайме.

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

Ха вот ты дурачек

дурачек

Ха, вот ты слабоумненький.

Неужели думаешь что типы без компилятора существовать не могут?

Неужели ты нашел это в моих словах?

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

Если другие кажутся тебе психами - немалые шансы, что ты сам псих.

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

А другие упорыши считают, что типы существуют, даже если компилятор о них ничего не знает.

В динамических языках компилятор о типах знает. Иначе он код скомпилировать не сможет.

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

А ошибка при компиляции лучше ошибки в рантайме.

Это неверно. Лучше та ошибка, которую проще обнаружить и исправить (а еще лучше та, у которой ниже стоимость факапа, но это уже не про типизацию). Исправление от системы типов не зависит, а вот что до обнаружения - есть целый класс ошибок (ошибки вида «упало при первом запуске»), которые обнаруживаются лучше при строгой динамической типизации, т.к. рантайм указывает точное место ошибки и ее характер, а тайпчекер - нет. Конечно же, есть ошибки, которые лучше ловятся тайпчекером. А вот то, как эти классы друг к другу относятся - это уже вопрос отдельный.

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

А ошибка при компиляции лучше ошибки в рантайме.

Это неверно. Лучше та ошибка, которую проще обнаружить и исправить

Да. И проще обнаружить и исправить те ошибки, которые проявляются во время компиляции.

еще лучше та, у которой ниже стоимость факапа, но это уже не про типизацию

Это тоже про типизацию.

рантайм указывает точное место ошибки и ее характер, а тайпчекер - нет

Проверка типов в рантайме ровно никак не противоречит проверкам типов тайпчекером.

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

Проверка типов в рантайме ровно никак не противоречит проверкам типов тайпчекером.

Противоречит. Программа не скомпилируется => тест не запустится и у тебя не будет корректного сообщения об ошибке.

Да. И проще обнаружить и исправить те ошибки, которые проявляются во время компиляции.

Это не так. Еще раз - существует целый класс ошибок, который проще обнаруживать в случае рантайм-ошибки.

Это тоже про типизацию.

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

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

Еще раз - существует целый класс ошибок, который проще обнаруживать в случае рантайм-ошибки

...для некоторого значения «проще».

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

От запуска программы на трансляцию $ не тратятся. Разве что транслятор взят в аренду.

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

...для некоторого значения «проще».

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

От запуска программы на трансляцию $ не тратятся.

Это тут причем? $ тратятся от ошибок в продакшене. И типизация никак не может предсказать, сколько $ будет стоить ошибка в продакшене (хотя все ошибки, которые ловятся тестами и типами, один хрен стоят копейки, но это уже другой разговор)

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

существует целый класс ошибок, который проще обнаруживать в случае рантайм-ошибки

А можно минимальный пример, чтоб точно понимать о каких ошибках идет речь?

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

А можно минимальный пример, чтоб точно понимать о каких ошибках идет речь?

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

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

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

Да нихрена он не укажет больше, чем указал бы тайпчекер.

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

Да нихрена он не укажет больше, чем указал бы тайпчекер.

Конечно, укажет, ведь рантайм знает, где что упало, а чекер - не знает, где оно должно упасть. В рантайме строго большее количество информации о программе.

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

Конечно, укажет, ведь рантайм знает, где что упало, а чекер - не знает, где оно должно упасть. В рантайме строго большее количество информации о программе.

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

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

Ошибка не обязательно находится там где упало.

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

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

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

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

Зачем?

Тайпчекер тебе точно скажет, в чем проблема

Каким образом он это скажет, если он, грубо говоря, не знает таких терминов даже? Тайпчекер оперирует терминами несоответствия типов (или, что значительно хуже, вывода типов), что не имеет, за исключением простейших случаев, никакого отношения к реальному характеру ошибки.

Тайпчекер выполняет часть этой работы за тебя.

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

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

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

Нет, т.к. без проверки типов может быть нарушена целостность данных.

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

Может и быть, зависит от реализации и степени оптимизации рантайма.

Зачем?

Затем, что «ошибка не обязательно находится там где упало» (с).

Каким образом он это скажет, если он, грубо говоря, не знает таких терминов даже?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Затем, что «ошибка не обязательно находится там где упало» (с).

Это если говорить об ошибках в общем, тут конечно ошибка в одном месте программы может отозваться в любом другом. Ошибка же типов (если речь идет о системах типах слабее, чем зависимых, например типизации на базе SystemF) ВСЕГДА находится там, где упало.

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