На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (33) « Первая ... 19 20 [21] 22 23 ...  32 33  ( Перейти к последнему сообщению )  
> trait + impl vs class , навеяно Rust'ом
    А если я сгенерирую списки с рандомной длиной? Как компилятор это вообще сможет проверить?
      Цитата OpenGL @
      А если я сгенерирую списки с рандомной длиной? Как компилятор это вообще сможет проверить?

      Попробуй еще тут посмотреть


      В ЖЖ есть код на C#.
        А, ну вот цитату нашёл.
        Цитата
        В данном случае - совпадение длин двух массивов. Чтобы программа, допускающая, что массивы могут оказаться разной длины, не скомпилировалась. Я показал, как это делается, а мой оппонент www_linux_org_ru показал строчку, нарушающую этот инвариант, и убедился, что она не компилируется.

        Т.е. в моём примере выше может быть так, что массивы будут разной длины - ошибка компиляции. Интересно.
          Цитата OpenGL @
          А если я сгенерирую списки с рандомной длиной? Как компилятор это вообще сможет проверить?

          Он проверяет корректность с точки зрения типизации и параметрического полиморфизма. А сами типы составлены так, что если ты попытаешься сформировать списки разной длины, то компилятор тебе об этом скажет. На C++/D/Rust(хотя вот в Rust могли бы решить иначе) это приводит к бесконечному инстанцированию(что решается стиранием типа вручную, которое же приводит к тому, что задача решена не полноценно и проверки легко обходятся в коде без каких-либо хаков).

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

          Но это требует определенных ограничений при формировании списка. Если просто так независимо сгенерировать два рэндомных списка, то, естественно, компилятор помочь не сможет.
            Цитата MyNameIsIgor @
            И каким образом вы мне гарантируете, что в этом вашем модуле нет ошибок с обработкой списков разной длины, например?
            А каким образом вы мне гарантируете что в этом вашем компиляторе Хаскеля нет ошибок? Так или иначе мы должны постулировать истинность некоторых частей кода. В D нет встроенной функциональности для работы с такого рода списками, ее приходится эмулировать и постулировать верность этой эмуляции, иначе задача теряет смысл.
            Цитата MyNameIsIgor @
            Не принимается. Мы создаём её с ошибкой, потому что предоставленная вами иерархия позволяет создать с ошибкой.
            Я не предоставляю вам такой иерархии, и она вам не нужна для генерации списков. Но я также не могу ее скрыть, поэтому вы имеете к ней доступ. В Хаскеле она скрыта изначально - все типы выводятся автоматически. Языки ставятся в неравные условия.
            Цитата MyNameIsIgor @
            В том же решении на шарпе такого не было.
            С этим согласен, но надо еще посмотреть код. Вы сами-то пытались его сломать?
              Цитата applegame @
              А каким образом вы мне гарантируете что в этом вашем компиляторе Хаскеля нет ошибок? Так или иначе мы должны постулировать истинность некоторых частей кода.

              Вот мы и постулировали - компилятор правильный. Некоторым этого достаточно :)
              Цитата applegame @
              Я не предоставляю вам такой иерархии, и она вам не нужна для генерации списков. Но я также не могу ее скрыть, поэтому вы имеете к ней доступ

              Ну, как уже спрашивал D_KEY, как работать то с ними, если они скрыты? Вам придётся их открыть, чтобы компилятор на их основе хоть что-то доказывал.
              Цитата applegame @
              С этим согласен, но надо еще посмотреть код. Вы сами-то пытались его сломать?

              Сломать то можно - вставить обращение по null или деление ноль. Только к спискам отношения не будет иметь.

              Добавлено
              Цитата applegame @
              В Хаскеле она скрыта изначально - все типы выводятся автоматически. Языки ставятся в неравные условия.

              Каким образом вывод типов их скрывает? Они отнюдь не скрыты.
                Цитата D_KEY @
                Хм. Что такого я сделал? Ты сам это делаешь при вызове main_ :-?
                Нет не делаю. Полагаю ты видишь разницу между List!N и List!1? В main_ тип выводится автоматически, а ты указываешь его явно.

                Добавлено
                Цитата MyNameIsIgor @
                Каким образом вывод типов их скрывает? Они отнюдь не скрыты.
                Может я слишком плохо знаю Хаскель. Возьмем два выражения для этой задачи:
                ExpandedWrap disabled
                  Сons i*i as

                и
                ExpandedWrap disabled
                  Cons i*i (Cons i*i as)

                Они, имеют один тип, но компилятор может эти типы как-то различить. То есть где-то там внутри есть некое дополнительное свойство - скрытый "тип". Есть ли у меня возможность принудительно скастовать второе выражение к первому, так чтобы компилятор продолжал считать эти типы разными?

                В D мне удалось сделать так, чтобы выражения cons(i*i, as) и cons(i*i, cons(i*i, as) имели автоматически выводимф разный тип. А вы своим вмешательством его меняете.
                Сообщение отредактировано: applegame -
                  Цитата applegame @
                  Они, имеют один тип, но компилятор может эти типы как-то различить. То есть где-то там внутри есть некое дополнительное свойство - скрытый "тип".

                  Нет, они имеют разные типы.
                  Цитата applegame @
                  Есть ли у меня возможность принудительно скастовать второе выражение к первому, так чтобы компилятор продолжал считать эти типы разными?

                  Нет, просто потому, что это преобразование незаконно.
                    Цитата MyNameIsIgor @
                    Нет, они имеют разные типы.
                    А. ну тогда тем более.
                    Цитата MyNameIsIgor @
                    Нет, просто потому, что это преобразование незаконно.
                    Да. А в D - законно. Может не будем тогда незаконно менять тип возвращаемый cons и незаконно конструировать списки неверного типа?

                    Добавлено
                    Цитата MyNameIsIgor @
                    Вот мы и постулировали - компилятор правильный. Некоторым этого достаточно :)
                    Почему бы нам тогда не постулировать, что эмуляция генератора списка - верная. Ведь если ее нет в компиляторе мы вынуждены ее эмулировать.
                      Цитата applegame @
                      Да. А в D - законно. Может не будем тогда незаконно менять тип возвращаемый cons и незаконно конструировать списки неверного типа?

                      Ничего не понял. Если в D она законна, то почему незаконно сконструировали?
                      Цитата applegame @
                      Почему бы нам тогда не постулировать, что эмуляция генератора списка - верная. Ведь если ее нет в компиляторе мы вынуждены ее эмулировать.

                      А почему просто не постулировать, что вы задачу решили, опозорили всех сомневающихся и покинули поле брани на белом коне?
                      Ещё раз: попытайтесь быть честным хотя бы перед самим собой.
                        Цитата MyNameIsIgor @
                        Ничего не понял. Если в D она законна, то почему незаконно сконструировали?
                        Потому что в Хаскеле незаконно.
                        Цитата MyNameIsIgor @
                        Ещё раз: попытайтесь быть честным хотя бы перед самим собой.
                        Перед собой я честен. Вам пока не удалось меня убедить, что задача не решена. Лучше конечно спросить у автора. Потому что я полагаю, что вы добавляете туда какие-то новые правила. Следующая моя цель сломать джавовский вариант через подмену типов. Если не удасться - то я признаю, что был не прав.
                          Цитата applegame @
                          Потому что в Хаскеле незаконно.

                          :wacko:
                          Цитата applegame @
                          Перед собой я честен.

                          Ууууууу... Ну, тогда беда-пичаль.
                            Кто может вот этот код переделать так, чтобы он компилялся? А то я не догоняю, как это заставить работать в ideone - http://ideone.com/1S3L6V
                            Цитата MyNameIsIgor @
                            Ууууууу... Ну, тогда беда-пичаль.
                            Может и беда, а может и нет. Посмотрим.
                            Сообщение отредактировано: applegame -
                              Цитата applegame @
                              Кто может вот этот код переделать так, чтобы он компилялся? А то я не догоняю, как это заставить работать в ideone - http://ideone.com/1S3L6V

                              Компилятор же говорит, что надо сделать - http://ideone.com/iglyDq
                                Цитата applegame @
                                Цитата D_KEY @
                                Хм. Что такого я сделал? Ты сам это делаешь при вызове main_ :-?
                                Нет не делаю. Полагаю ты видишь разницу между List!N и List!1? В main_ тип выводится автоматически, а ты указываешь его явно.

                                Эм. Возможно я чего-то и не понял, но разве вот тут:
                                ExpandedWrap disabled
                                  main_(n - 1, i + 1, cons(2*i + 1, as), cons(i*i, bs));

                                При вызове cons вызывается не первая перегрузка?
                                ExpandedWrap disabled
                                  auto cons(int N)(int head, List!N tail) { return new ListN!1(head, tail); }

                                А разве при передачи в main_ ListN!1 не кастуется к List!1?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (33) « Первая ... 19 20 [21] 22 23 ...  32 33


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0694 ]   [ 15 queries used ]   [ Generated: 20.07.25, 14:10 GMT ]