На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (495) « Первая ... 360 361 [362] 363 364 ...  494 495  ( Перейти к последнему сообщению )  
> Delphi vs C++ vs C# , ну и Java немножко, где-то ближе к старшему байту номеров страниц
    Цитата D_KEY @
    Но ты в них задаешь одно и тоже - контракт, причем задаешь одни и тем же образом.

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

      Соглашусь :) Я и не утверждал, что подходит...
        Цитата D_KEY @
        Почему вместо? Почему необходимо?

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

        ExpandedWrap disabled
          interface Plus {
              Plus add(Plus);
              Intermediate toIntermediate();
          }
           
          class Int implements Plus {
              int value = 0;
              
              public Int() {}
              public Int(Intermediate x) {
                  ...
              }
              
              public Plus add(Plus y) {
                  return Int(this.toIntermediate + y.toIntermediate);
              }
          }

        в итоге, мы придем к тому, что интерфейсы вообще окажутся ненужными и мы вполне можем обойтись тайпклассами.
          korvin, давайте я попробую переписать код так
          ExpandedWrap disabled
            // Концепт/интерфейс, параметризируется неким типом
            concept Plus<class T>
            {
              T operator+ (T, T);
            }
             
            // Шаблонная функция
            template<class T>
            requares Plus<T>    // Требуем, чтобы для типа T выполнялся концепт Plus, т.е. существовал operator+ (T, T)
            T f(T x, T y)
            {
              return x + y;
            }
             
            Plus<int> f(Plus<int> x, Plus<int> y)   // Здесь уже Plus - это интерфейс, а int - то самое промежуточное представление
            {
              return x + y;
            }

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

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

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

            В данном случае - да. Но мне интересно, что ты собираешься делать, если тебе захочется динамического связывания и замены типов объектов в рантайме?
            Не придется ли писать все тоже самое для интерфейса, что ты уже написал для тайпкласса?
              Цитата D_KEY @
              А чем тебя не устроит кинутое исключение в операторе + конкретного типа при обнаружении, что аргумент метода имеет какой-то другой тип?

              Проблема в том, что если интерфейсы имеют утиную типизацию, то их реализация может даже не предполагать, что ей будет передан какой-то неподходящий тип.
                Цитата MyNameIsIgor @
                Цитата D_KEY @
                А чем тебя не устроит кинутое исключение в операторе + конкретного типа при обнаружении, что аргумент метода имеет какой-то другой тип?

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

                В случае настолько сильной утиности, тебе придется проводить такую проверку в любом случае на уровне рантайма языка.
                  Цитата D_KEY @
                  Нет, только тот, для которого есть инстанс. Если инстанса нет, то аргумент не пройдет

                  о чем нам сообщит компилятор, и мы определим инстанс для любого типа, любого класса типов.

                  Цитата D_KEY @
                  точно также, как в случае утиных интерфейсов, если наш тип не удовлетворяет интерфейсу и/или не создан соответствующий адаптер.

                  только статическая информация о типе стирается, ага

                  Добавлено
                  Цитата MyNameIsIgor @
                  korvin, давайте я попробую переписать код так

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

                    В случае интерфейсов нам так же сообщит компилятор, а о чем не сможет - сообщит рантайм система языка.

                    Цитата
                    Цитата D_KEY @
                    точно также, как в случае утиных интерфейсов, если наш тип не удовлетворяет интерфейсу и/или не создан соответствующий адаптер.

                    только статическая информация о типе стирается, ага

                    Так никто же не говорит о замене ;)
                      Цитата D_KEY @
                      А чем тебя не устроит кинутое исключение в операторе + конкретного типа при обнаружении, что аргумент метода имеет какой-то другой тип? Так ведут себя все динамические языки.

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

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

                      в статически-типизированном языке с тайпклассами, параметрическим полиморфизмом и выводом типов? нет, не захочется.

                      Добавлено
                      Цитата D_KEY @
                      В случае интерфейсов нам так же сообщит компилятор, а о чем не сможет - сообщит рантайм система языка.

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

                        Почему? Как это помешает необходимости создания объекта нужного типа в рантайме и использованию его в соответствии с динамическим контрактом?
                        Или же тебе придется делать гигантские алгебр. типы данных, перечисляя в них то, что при нормальном дизайне было бы отдельными типами...

                        Добавлено
                        Цитата korvin @
                        Цитата D_KEY @
                        В случае интерфейсов нам так же сообщит компилятор, а о чем не сможет - сообщит рантайм система языка.

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

                        Если тебе не нужно это в динамике, делай все в статике, в чем проблема? Разве это повод запрещать такие механизмы?
                          Цитата D_KEY @
                          Почему? Как это помешает необходимости создания объекта нужного типа в рантайме и использованию его в соответствии с динамическим контрактом?
                          Или же тебе придется делать гигантские алгебр. типы данных, перечисляя в них то, что при нормальном дизайне было бы отдельными типами...

                          в хаскелле нет рантайма =) но ты можешь предложить конкретный пример своей волшебной ситуации и мы посмотрим, что тут может предложить хаскелл, мне пока таких ситуаций на ум не приходит =/

                          Добавлено
                          Цитата D_KEY @
                          Если тебе не нужно это в динамике, делай все в статике, в чем проблема? Разве это повод запрещать такие механизмы?

                          запрещать механизм, приводящий к потере информации о типе в статике?... <_< да, это не повод, это причина

                          Добавлено
                          только не надо примеров вида "необходимо в зависимости от входных данных, вернуть объекты разных типов" =) это не задача, а способ решения =)
                          Сообщение отредактировано: korvin -
                            Цитата korvin @
                            только не надо примеров вида "необходимо в зависимости от входных данных, вернуть объекты разных типов" =) это не задача, а способ решения =)

                            Хм. Если это способ решения, то какой задачи? И что тут предлагает Haskell?
                              Цитата D_KEY @
                              Хм. Если это способ решения, то какой задачи? И что тут предлагает Haskell?

                              вот ты мне и скажи
                                Можешь для начала рассказать, как делается в Haskell сериализация и восстановление. А там посмотрим.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 360 361 [362] 363 364 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.4863 ]   [ 15 queries used ]   [ Generated: 31.07.26, 00:55 GMT ]