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

    Этот пример наглядно демонстрирует подход "Со своим уставом в чужой монастырь". Это, по факту, копипаста из C++, которая внезапно не работает в другом языке.
      Цитата Da$aD @
      Этот пример наглядно демонстрирует подход "Со своим уставом в чужой монастырь". Это, по факту, копипаста из C++, которая внезапно не работает в другом языке.
      A этот пример наглядно демонстрирует, что вы не понимаете о чем идет речь. А речь идет явно не о C++ vs Java.
      Сообщение отредактировано: applegame -
        Кажется я достиг дзен. Если заблуждаюсь поправьте.
        Итак, рассуждения в контексте Java:
        Долго думал как оно вообще работает. Дело в том, что просто стирания типов явно недостаточно для компиляции кода той самой задачи.
        Стирание типов позволяет нам создать один-единственный экземпляр функции, работающий с, грубо говоря, void*. Но что делать с бесконечной генерацией типов, которая, казалось бы необходима для проверки типов compile-time? И вот тут, как я полагаю, происходит самое интересное: компилятор определяет, что доказать правильность использования этой бесконечной последовательности типов (допустим A<A<A<A....) можно доказав утверждение: если для любого типа T верен тип A<T>, то также будет верент тип A<A<T>>. Тогда можно не разворачивать в бесконечность типы - все равно в run-time все сведется к void*.
        Подозреваю, что в каких-то случаях компилятор жабы может лажать и таки ударяться в бесконечное разворачивание. Но не буду утвержать.

        Что касается C++/D, то такую оптимизацию мы делать не можем из-за требования разворачивать типы до упора.
          Цитата applegame @
          Бида, печаль. В жабе для того что бы ПП-функция могла принимать несколько разных типов, мы вынуждены создать дополнительный тип с "общим" методом и от него унаследоваться. Но тогда получается, что наша ПП-функция де-факто принимает параметр одного типа:

          На самом деле бида-пичаль в том, что в твоём примере нет никакого ПП.

          Твой пример почти полностью соответствует этому.

          Никакого ПП здесь нет.

          Вот это ПП: Haskell, Java.

          Конечно в джаве не всё так гладко, но ты можешь взять Scala, например.
            Цитата korvin @
            На самом деле бида-пичаль в том, что в твоём примере нет никакого ПП.
            До-о-о. Бида и пичаль, что и в Haskell невозможно обойтись без лишнего типа. В твоем варианте - класс Test, которым ты объединил Foo и Bar. К счастью в Haskell - это делается куда изящнее чем в жабе.
              Цитата applegame @
              До-о-о. Бида и пичаль, что и в Haskell невозможно обойтись без лишнего типа. В твоем варианте - класс Test, которым ты объединил Foo и Bar. К счастью в Haskell - это делается куда изящнее чем в жабе.

              Какого "лишнего типа"? Во-первых, там нет никакого лишнего типа, во-вторых, ты, похоже, вообще не понимаешь, что такое ПП.
              Сообщение отредактировано: korvin -
                Цитата applegame @
                Цитата korvin @
                На самом деле бида-пичаль в том, что в твоём примере нет никакого ПП.
                До-о-о. Бида и пичаль, что и в Haskell невозможно обойтись без лишнего типа. В твоем варианте - класс Test, которым ты объединил Foo и Bar. К счастью в Haskell - это делается куда изящнее чем в жабе.

                class в haskell - это тайпкласс, а не тип.
                  Цитата D_KEY @
                  class в haskell - это тайпкласс, а не тип.
                  Как говориться, тот же тип - вид сбоку. Похоже на traits из Rust, который тоже, как бы не тип :)

                  Добавлено
                  Цитата korvin @
                  Вот это ПП: Haskell, Java.

                  Но, как только мы пишем аналог на D, то ПП магически исчезает. :)
                  Сообщение отредактировано: applegame -
                    Цитата applegame @
                    Цитата D_KEY @
                    class в haskell - это тайпкласс, а не тип.
                    Как говориться, тот же тип - вид сбоку.

                    :facepalm: Ты про первый пример что ли? Я же тебе написал, что там фактически нет ПП.
                      Цитата applegame @
                      Цитата D_KEY @
                      Не делают. Плюсы ничего не выводят.
                      Ну как же? Код аналогичный жабовскому в первом примере скомпилируется.

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

                      Цитата
                      она мне доказывает, что я не могу выполнить метод test для объекта с типом Foo, что является ложью.

                      Ты читаешь сообщения компилятора?
                      Ты не можешь выполнить метод test для объекта типовой переменной T, потому, что тебе о типе ничего неизвестно(в случае чистого ПП и не должно). И именно об этом тебе скажет компилятор. Ругаться он будет и без Foo и Bar. Они в твоём примере не нужны.

                      Ты мешаешь в одну кучу ПП и специальный полиморфизм.
                        Цитата korvin @
                        Какого "лишнего типа"? Во-первых, там нет никакого лишнего типа,
                        Пардон, попутал примеры.
                          Цитата applegame @
                          Но, как только мы пишем аналог на D, то ПП магически исчезает. :)

                          Куда? Пропиши все типы явно, без auto и alias. А то я тоже могу в исходнике на Хаскелле убрать все типы, но мы тут не вывод типов обсуждаем.
                            Цитата applegame @
                            Как говориться, тот же тип - вид сбоку.

                            Нет. Это тайпкласс :)

                            Цитата
                            Похоже на traits из Rust, который тоже, как бы не тип :)

                            Скорее похоже на плюсовые концепты, которые не типы.
                            trait в Rust вполне тип.

                            Цитата
                            Но, как только мы пишем аналог на D, то ПП магически исчезает. :)

                            Это имитация. Я же могу специализировать transform? Значит это вид специального полиморфизма, просто конкретно в твоём случае ты используешь только реализацию по умолчанию.
                            Сообщение отредактировано: D_KEY -
                              Цитата D_KEY @
                              Ты не можешь выполнить метод test для объекта типовой переменной T, потому, что тебе о типе ничего неизвестно(в случае чистого ПП и не должно).
                              Все верно. Но тип знать и не требуется. Требуется знать, поддерживает тип какую-либо операцию или нет.

                              Добавлено
                              Цитата korvin @
                              Куда?
                              Откуда, я знаю. Спроси у D_KEY. :)
                              Цитата korvin @
                              Пропиши все типы явно, без auto и alias. А то я тоже могу в исходнике на Хаскелле убрать все типы, но мы тут не вывод типов обсуждаем.
                              alias и auto просто для удобства. Они роли не играют.

                              Добавлено
                              Цитата D_KEY @
                              Я же могу специализировать transform? Значит это вид специального полиморфизма
                              А можешь и не специализировать, тогда это не будет видом специального полиморфизма :).
                              Сообщение отредактировано: applegame -
                                Цитата applegame @
                                По D_KEY исчезают. alias и auto просто для удобства. Они роли не играют.

                                Я не знаю, что там в D, но D_KEY пишет о том, что плюсовый шаблон может иметь специализацию, отличную от обобщенного варианта (перегрузку, в некотором смысле), например:

                                ExpandedWrap disabled
                                  template<typename T>
                                  int length(vector<T> xs) { return xs.size(); }
                                   
                                  template<>
                                  int length(vector<int> xs) { return 1234; }


                                т.е. для разных типов функция length показывает разное поведение, что является ad-hoc полиморфизмом.

                                ПП-функция же имеет всегда одинаковое поведение для любых типов.
                                Сообщение отредактировано: korvin -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (33) « Первая ... 23 24 [25] 26 27 ...  32 33


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