LINUX.ORG.RU

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

 , ,


0

2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Тупой элементарный пример:

// Вот тут ошибка, присвоили значение не той переменной:
x = "Hello, I am an error!"
....
// миллион строчек кода
....
y = 1
z = x+y // упадет здесь, но ошибка была выше
Waterlaz ★★★★★
()
Ответ на: комментарий от Waterlaz

Так нет, ошибка не в х. С х все в порядке. Вот именно тот момент где чекер тебе выдаст не то место ошибки (в х, вместо +).

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

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

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

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

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

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

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

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

Так нет, ошибка не в х. С х все в порядке.

Нет, с 'x' как раз все хреново, и это именно та ошибка в коде, которую надо найти

чекер тебе выдаст не то место ошибки (в х, вместо +).

error: no match for ‘operator+’ (operand types are ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’ and ‘int’)
     x + y;
     ~~^~~
anonymous
()
Ответ на: комментарий от anonymous

Нет, с 'x' как раз все хреново, и это именно та ошибка в коде, которую надо найти

Так проблема не с х, проблема с +, которому всунули строку вместо числа. Мог бы быть код вида

x = "yoba"
y = "huy" + 2
очевидно же, что ошибка не в х, правда? Она в тот терме, который является аргументом +.

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

error: no match for ‘

Так это мономорфный тип без инференса. То есть тот самый вариант, который работает нормально. Наверни туда шаблонов, посмотрим, какой он тебе cryptic error высрет.

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

Так проблема не с х, проблема с +, которому всунули строку вместо числа. Мог бы быть код вида

Хорошо, будь по твоему, ошибка в плюсе, но нам не это от компилятора/рантайма надо. Нам надо в конечном счете поправить x, а не +.

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

Нам надо в конечном счете поправить x, а не +.

x = "yoba";
y = "huy" + 2;

зачем поправлять х, еще раз? С ним все в порядке. Поправлять надо терм, который является аргументом +. Ошибка именно в нем. И, кстати, как выше показано, нормальные тайпчекеры (не убитые фулл инференсом) именно в том месте, где надо ее и показывают

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

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

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

То есть кажется, что чекер лучше: всё же он делает работу за меня. С философской точки зрения хорошо, когда кто-то делает работу за меня.

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

Если у вас есть информация о языках, где в типизации было осознанно принято и проведено в жизнь такое решение на уровне языка, то прошу имена в студию :)

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

зачем поправлять х, еще раз?

По условию задачи там опечатка. =)

С ним все в порядке.

Да, давайте исправлять там, где падает, а не так, чтобы работало правильно =)

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

По условию задачи там опечатка. =)

Тогда надо было указать для икса тип

Да, давайте исправлять там, где падает, а не так, чтобы работало правильно =)

Если ты исправишь там, где падает, то будет работать правильно.

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

Если ты исправишь там, где падает, то будет работать правильно.

Не будет. Правильно там складывать два числа x и y. Как мне исправить в том месте так, чтобы работало правильно?

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

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

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

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

Теперь ты предлагаешь смотреть на неправильно работающую программу и убеждать себя и всех остальных, что она работает правильно =)

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

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

Каждый адепт строгой типизации и чистых функций знает об алгоритме типизации Хиндли — Милнера, а «компейлятор проверяет типы» в любом языке со статической типизацией. Пожалуйста, не пиши больше такого бреда.

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

в 2016 году еще кто-то верит в существование т.н. «тайпчекеров»? поразительно

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