
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.218] |
![]() |
|
Страницы: (33) « Первая ... 19 20 [21] 22 23 ... 32 33 ( Перейти к последнему сообщению ) |
![]() |
Сообщ.
#301
,
|
|
А если я сгенерирую списки с рандомной длиной? Как компилятор это вообще сможет проверить?
|
Сообщ.
#302
,
|
|
|
Цитата OpenGL @ А если я сгенерирую списки с рандомной длиной? Как компилятор это вообще сможет проверить? Попробуй еще тут посмотреть В ЖЖ есть код на C#. |
![]() |
Сообщ.
#303
,
|
|
А, ну вот цитату нашёл.
Цитата В данном случае - совпадение длин двух массивов. Чтобы программа, допускающая, что массивы могут оказаться разной длины, не скомпилировалась. Я показал, как это делается, а мой оппонент www_linux_org_ru показал строчку, нарушающую этот инвариант, и убедился, что она не компилируется. Т.е. в моём примере выше может быть так, что массивы будут разной длины - ошибка компиляции. Интересно. |
Сообщ.
#304
,
|
|
|
Цитата OpenGL @ А если я сгенерирую списки с рандомной длиной? Как компилятор это вообще сможет проверить? Он проверяет корректность с точки зрения типизации и параметрического полиморфизма. А сами типы составлены так, что если ты попытаешься сформировать списки разной длины, то компилятор тебе об этом скажет. На C++/D/Rust(хотя вот в Rust могли бы решить иначе) это приводит к бесконечному инстанцированию(что решается стиранием типа вручную, которое же приводит к тому, что задача решена не полноценно и проверки легко обходятся в коде без каких-либо хаков). Добавлено Цитата OpenGL @ Т.е. в моём примере выше может быть так, что массивы будут разной длины - ошибка компиляции. Интересно. Но это требует определенных ограничений при формировании списка. Если просто так независимо сгенерировать два рэндомных списка, то, естественно, компилятор помочь не сможет. |
Сообщ.
#305
,
|
|
|
Цитата MyNameIsIgor @ А каким образом вы мне гарантируете что в этом вашем компиляторе Хаскеля нет ошибок? Так или иначе мы должны постулировать истинность некоторых частей кода. В D нет встроенной функциональности для работы с такого рода списками, ее приходится эмулировать и постулировать верность этой эмуляции, иначе задача теряет смысл.И каким образом вы мне гарантируете, что в этом вашем модуле нет ошибок с обработкой списков разной длины, например? Цитата MyNameIsIgor @ Я не предоставляю вам такой иерархии, и она вам не нужна для генерации списков. Но я также не могу ее скрыть, поэтому вы имеете к ней доступ. В Хаскеле она скрыта изначально - все типы выводятся автоматически. Языки ставятся в неравные условия.Не принимается. Мы создаём её с ошибкой, потому что предоставленная вами иерархия позволяет создать с ошибкой. С этим согласен, но надо еще посмотреть код. Вы сами-то пытались его сломать? |
Сообщ.
#306
,
|
|
|
Цитата applegame @ А каким образом вы мне гарантируете что в этом вашем компиляторе Хаскеля нет ошибок? Так или иначе мы должны постулировать истинность некоторых частей кода. Вот мы и постулировали - компилятор правильный. Некоторым этого достаточно ![]() Цитата applegame @ Я не предоставляю вам такой иерархии, и она вам не нужна для генерации списков. Но я также не могу ее скрыть, поэтому вы имеете к ней доступ Ну, как уже спрашивал D_KEY, как работать то с ними, если они скрыты? Вам придётся их открыть, чтобы компилятор на их основе хоть что-то доказывал. Цитата applegame @ С этим согласен, но надо еще посмотреть код. Вы сами-то пытались его сломать? Сломать то можно - вставить обращение по null или деление ноль. Только к спискам отношения не будет иметь. Добавлено Цитата applegame @ В Хаскеле она скрыта изначально - все типы выводятся автоматически. Языки ставятся в неравные условия. Каким образом вывод типов их скрывает? Они отнюдь не скрыты. |
Сообщ.
#307
,
|
|
|
Нет не делаю. Полагаю ты видишь разницу между List!N и List!1? В main_ тип выводится автоматически, а ты указываешь его явно.
Добавлено Цитата MyNameIsIgor @ Может я слишком плохо знаю Хаскель. Возьмем два выражения для этой задачи:Каким образом вывод типов их скрывает? Они отнюдь не скрыты. ![]() ![]() Сons i*i as и ![]() ![]() Cons i*i (Cons i*i as) Они, имеют один тип, но компилятор может эти типы как-то различить. То есть где-то там внутри есть некое дополнительное свойство - скрытый "тип". Есть ли у меня возможность принудительно скастовать второе выражение к первому, так чтобы компилятор продолжал считать эти типы разными? В D мне удалось сделать так, чтобы выражения cons(i*i, as) и cons(i*i, cons(i*i, as) имели автоматически выводимф разный тип. А вы своим вмешательством его меняете. |
Сообщ.
#308
,
|
|
|
Цитата applegame @ Они, имеют один тип, но компилятор может эти типы как-то различить. То есть где-то там внутри есть некое дополнительное свойство - скрытый "тип". Нет, они имеют разные типы. Цитата applegame @ Есть ли у меня возможность принудительно скастовать второе выражение к первому, так чтобы компилятор продолжал считать эти типы разными? Нет, просто потому, что это преобразование незаконно. |
Сообщ.
#309
,
|
|
|
Цитата MyNameIsIgor @ А. ну тогда тем более.Нет, они имеют разные типы. Цитата MyNameIsIgor @ Да. А в D - законно. Может не будем тогда незаконно менять тип возвращаемый cons и незаконно конструировать списки неверного типа? Нет, просто потому, что это преобразование незаконно. Добавлено Цитата MyNameIsIgor @ Почему бы нам тогда не постулировать, что эмуляция генератора списка - верная. Ведь если ее нет в компиляторе мы вынуждены ее эмулировать. Вот мы и постулировали - компилятор правильный. Некоторым этого достаточно ![]() |
Сообщ.
#310
,
|
|
|
Цитата applegame @ Да. А в D - законно. Может не будем тогда незаконно менять тип возвращаемый cons и незаконно конструировать списки неверного типа? Ничего не понял. Если в D она законна, то почему незаконно сконструировали? Цитата applegame @ Почему бы нам тогда не постулировать, что эмуляция генератора списка - верная. Ведь если ее нет в компиляторе мы вынуждены ее эмулировать. А почему просто не постулировать, что вы задачу решили, опозорили всех сомневающихся и покинули поле брани на белом коне? Ещё раз: попытайтесь быть честным хотя бы перед самим собой. |
Сообщ.
#311
,
|
|
|
Цитата MyNameIsIgor @ Потому что в Хаскеле незаконно.Ничего не понял. Если в D она законна, то почему незаконно сконструировали? Цитата MyNameIsIgor @ Перед собой я честен. Вам пока не удалось меня убедить, что задача не решена. Лучше конечно спросить у автора. Потому что я полагаю, что вы добавляете туда какие-то новые правила. Следующая моя цель сломать джавовский вариант через подмену типов. Если не удасться - то я признаю, что был не прав. Ещё раз: попытайтесь быть честным хотя бы перед самим собой. |
Сообщ.
#312
,
|
|
|
Цитата applegame @ Потому что в Хаскеле незаконно. ![]() Цитата applegame @ Перед собой я честен. Ууууууу... Ну, тогда беда-пичаль. |
Сообщ.
#313
,
|
|
|
Кто может вот этот код переделать так, чтобы он компилялся? А то я не догоняю, как это заставить работать в ideone - http://ideone.com/1S3L6V
Цитата MyNameIsIgor @ Может и беда, а может и нет. Посмотрим. Ууууууу... Ну, тогда беда-пичаль. |
Сообщ.
#314
,
|
|
|
Цитата applegame @ Кто может вот этот код переделать так, чтобы он компилялся? А то я не догоняю, как это заставить работать в ideone - http://ideone.com/1S3L6V Компилятор же говорит, что надо сделать - http://ideone.com/iglyDq |
Сообщ.
#315
,
|
|
|
Цитата applegame @ Нет не делаю. Полагаю ты видишь разницу между List!N и List!1? В main_ тип выводится автоматически, а ты указываешь его явно. Эм. Возможно я чего-то и не понял, но разве вот тут: ![]() ![]() main_(n - 1, i + 1, cons(2*i + 1, as), cons(i*i, bs)); При вызове cons вызывается не первая перегрузка? ![]() ![]() auto cons(int N)(int head, List!N tail) { return new ListN!1(head, tail); } А разве при передачи в main_ ListN!1 не кастуется к List!1? |