На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (495) « Первая ... 356 357 [358] 359 360 ...  494 495  ( Перейти к последнему сообщению )  
> Delphi vs C++ vs C# , ну и Java немножко, где-то ближе к старшему байту номеров страниц
    MyNameIsIgor, ну вот такой код скомпиль:
    ExpandedWrap disabled
      template<typename... T>
      class A
      {
      public:
          template<typename T1, typename... T2>
          class B{};
      private:
      B<T...> b;
      };
       
      int main()
      {
          A<int, int, int> a;
      }
      Цитата MyNameIsIgor @
      Chrome - шуршит и не чихает

      Konqueror (из KDE) тоже. Думаю это благодаря вебкиту, надо бы на Safari проверить.

      Добавлено
      D_KEY
      кстати, по поводу интерфейсов и тайпклассов: интерфейсы являются типами, и реализация интерфейса приводит к созданию субтипа, тайпклассы же типами не являются, и соответственно "реализация" тайпкласса не приводит к созданию субтипа. это весьма важное отличие =)
      Сообщение отредактировано: korvin -
        Цитата korvin @
        интерфейсы являются типами, и реализация интерфейса приводит к созданию субтипа

        Гммм... А чем являются предлагаемые в C++ концепты и их реализация?
          Цитата korvin @
          кстати, по поводу интерфейсов и тайпклассов: интерфейсы являются типами, и реализация интерфейса приводит к созданию субтипа, тайпклассы же типами не являются, и соответственно "реализация" тайпкласса не приводит к созданию субтипа. это весьма важное отличие =)

          Спасибо. Но я не говорил, что это одно и тоже сейчас.
          Я тебе говорю о том, что абстрактные типы могут полностью обеспечить функциональность тайпклассов на концептуальном уровне.
          И потом, если "объект" некоторого типа можно рассматривать или как "объект" поддерживающий определенный интерфейс или как соответствующий определенному тайпклассу, то какая будет разница между этими понятиями для программиста и системы типов?
            ну вот смотри:
            ExpandedWrap disabled
              interface I {}
               
              class A implements I {}
              class B implements I {}
               
              I[] xs = new I[] { new A(), new B }; // работает

            ExpandedWrap disabled
              class I a where ...
               
              data A = A
              data B = B
               
              instance I A where ...
              instance I B where ...
               
              xs :: I a => [a]
              xs = [A, B] -- не работает
              Цитата korvin @
              ну вот смотри:

              Ну, вот ожидая такого кода, я и задал свой вопрос :)
              И опять же, обсуждаемые интерфейсы на утиной типизации - что, если работает принцип подстановки, то мы написали подтип, даже не подозревая об этом?
              Т.е. вопрос по сути сводится не к сравнению тайпклассов и интерфейсов, а к поддержке семантикой языка принципа подстановки для интерфейсов...
              Сообщение отредактировано: MyNameIsIgor -
                разница как для программиста, так и для системы типов (тем более для системы типов) весьма существенная. да, концептуально, можно в качестве тайпклассов использовать интерфейсы, но нен наоборот.

                Добавлено
                Цитата MyNameIsIgor @
                Ну, вот ожидая такого кода, я и задал свой вопрос :)
                И опять же, обсуждаемые интерфейсы на утиной типизации - что, если работает принцип подстановки, то мы написали подтип, даже не подозревая об этом?
                Т.е. вопрос по сути сводится не к сравнению тайпклассов и интерфейсов, а к поддержке семантикой языка принципа подстановки для интерфейсов...

                прости, не заметил твой вопрос, ответ: не знаю, я мало читал про концепты, можно сказать, что ничего не читал.

                а при чем тут утиная типизация, я не понял =/ как и в случае интерфейсов джавы/сишарп, так и в случае тайпклассов указание реализации происходит явно.
                Сообщение отредактировано: korvin -
                  Цитата korvin @
                  ну вот смотри:
                  работает
                  ...
                  не работает

                  Логично и связано с тем, на каком уровне мы работаем - уровне ограничений на динамический тип объекта или уровне ограничении на статический тип объекта.
                  Т.е.
                  ExpandedWrap disabled
                    concept I {};
                     
                    List<I> f1(I obj1, I obj2)
                    {
                        //...
                    }
                     
                    template<typename T : I>
                    List<T> f2(T obj1, T obj2)
                    {
                        //...
                    }


                  Но, по сути, ты прав. В первом случае I выступает как тип(еще точнее - как ограничитель объекта), во втором - как ограничитель типа. Но это не значит, что это должны быть разные сущности при объявлении.
                    Цитата D_KEY @
                    Логично и связано с тем, на каком уровне мы работаем - уровне ограничений на динамический тип объекта или уровне ограничении на статический тип объекта.

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

                    Добавлено
                    Цитата D_KEY @
                    Но это не значит, что это должны быть разные сущности при объявлении.

                    в смысле?
                      Цитата D_KEY @
                      Логично и связано с тем, на каком уровне мы работаем - уровне ограничений на динамический тип объекта или уровне ограничении на статический тип объекта.

                      До меня дошло...
                      Цитата korvin @
                      прости, не заметил твой вопрос, ответ: не знаю, я мало читал про концепты, можно сказать, что ничего не читал.

                      Всё, теперь вопрос закрыт.
                      Цитата korvin @
                      а при чем тут утиная типизация, я не понял =/

                      Вопрос был про гипотетическую возможность. Т.е. если у нас в языке используется утиная типизация для интерфейсов и код
                      ExpandedWrap disabled
                        interface I { void f(); }
                         
                        class A { void f() {} }
                        class B { void f() {} }
                         
                        I[] xs = new I[] { new A(), new B() }; // работает

                      то является ли I типом, а A и B - его под типами. Если я правильно понял объяснение D_KEY'я, то да, являются.
                        Цитата MyNameIsIgor @
                        Вопрос был про гипотетическую возможность. Т.е. если у нас в языке используется утиная типизация для интерфейсов и код
                        ExpandedWrap disabled
                          interface I { void f(); }
                           
                          class A { void f() {} }
                          class B { void f() {} }
                           
                          I[] xs = new I[] { new A(), new B() }; // работает

                        то является ли I типом, а A и B - его под типами. Если я правильно понял объяснение D_KEY'я, то да, являются.

                        мм... но я не про это говорил, ну да ладно. ну вот в Go так и есть.
                          Цитата korvin @
                          эм... в Go нет динамических типов и субтипирования, но есть интерфейссы и они работают как типы, да еще и не требуют явной декларации реализации.

                          И это клево :)

                          Цитата
                          Цитата D_KEY @
                          Но это не значит, что это должны быть разные сущности при объявлении.

                          в смысле?

                          Смотри мой пример на гипотетическом С-подобном языке. Концепт I объявлен один раз, но используется в двух местах. Для f1 это будет "тип"(ограничитель интерфейса объекта) объекта(утиная тут могла бы быть типизация или нет - вопрос отдельный - я за утиность). Для f2 это будет интерфейс, который должен будет предоставлять для своих объектов переданный тип T.
                            Цитата korvin @
                            мм... но я не про это говорил

                            Я понял, что не про то. А про то, что интерфейсы это
                            Цитата D_KEY @
                            тип(еще точнее - как ограничитель объекта)

                            а тайпклассы
                            Цитата D_KEY @
                            ограничитель типа

                            А D_KEY написал опять таки на гипотетическом языке, где одну и ту же сущность использовал и как интерфейс (т.е. как тип), и как ограничение на тип (т.е. тайпкласс или концепт), и на меня снизошло озарение :D
                              Цитата D_KEY @
                              Смотри мой пример на гипотетическом С-подобном языке. Концепт I объявлен один раз, но используется в двух местах. Для f1 это будет "тип"(ограничитель интерфейса объекта) объекта(утиная тут могла бы быть типизация или нет - вопрос отдельный - я за утиность). Для f2 это будет интерфейс, который должен будет предоставлять для своих объектов переданный тип T.

                              и что? он в обоих случаях у тебя тип =) т.е. твой второй пример это просто аналог
                              ExpandedWrap disabled
                                List<T extends I> f2(T x, T y) {
                                    ...
                                }


                              Добавлено
                              Цитата MyNameIsIgor @
                              и как ограничение на тип (т.е. тайпкласс или концепт), и на меня снизошло озарение :D

                              нет, не использовал =)
                                Цитата korvin @
                                и что? он в обоих случаях у тебя тип =) т.е. твой второй пример это просто аналог
                                ExpandedWrap disabled
                                  List<T extends I> f2(T x, T y) {
                                      ...
                                  }

                                Ты так и не прочитал про концепты? Нет, там нет никакого требования наследования.

                                Добавлено
                                Цитата korvin @
                                нет, не использовал =)

                                Очень интересно, а что я должен изменить, чтобы таки использовать?
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 356 357 [358] 359 360 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.4813 ]   [ 14 queries used ]   [ Generated: 31.07.26, 02:59 GMT ]