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

    Эммм... Ну, вот в случае концептов принцип подстановки не работает
    ExpandedWrap disabled
      template<typename T : I>
      List<T> f2(T obj1, T obj2)
      {
          I i = x; //не верно, вообще, полностью
      }

    А в коде
    ExpandedWrap disabled
      List<T extends I> f2(T x, T y) {
          I i = x; // работает
      }

    Собственно, что и показывалось для тайпклассов.
    С другой стороны, если интерфейсы как в Go, то и первый код рабочий. Тогда вообще размывается граница.
      Цитата D_KEY @
      Очень интересно, а что я должен изменить, чтобы таки использовать?

      перепиши без шаблона =)

      Добавлено
      Цитата MyNameIsIgor @
      С другой стороны, если интерфейсы как в Go, то и первый код рабочий. Тогда вообще размывается граница.

      эм, всмысле? который код? разница между чем и чем размывается?
        Цитата korvin @
        эм, всмысле? который код? разница между чем и чем размывается?

        Разница между не-типом (тайпклассом/концептом) и типом (интерфейсом), при том, что описано это как одна сущность.
        Цитата korvin @
        перепиши без шаблона =)

        Мб лучше вам прочитать про концепты? Здесь первый пост, объясняется на примерах кода, здесь поясняется словами, но примеры какие-то с ошибками... как будто смещены, т.е. когда пишут "этот пример" смотреть надо следующий :)
          Цитата korvin @
          Цитата D_KEY @
          Очень интересно, а что я должен изменить, чтобы таки использовать?

          перепиши без шаблона =)

          Зачем :) ?
          Ты понимаешь код только на Haskell-подобном языке?
          Хорошо:
          ExpandedWrap disabled
            concept I a where ...
             
            data A = A
            data B = B
             
            instance I A where ...
            instance I B where ...
             
            f1 :: [I]
            f1 = [A, B] -- работает
             
            f2 :: I a => [a]
            f2 = [A, B] -- не работает
          Сообщение отредактировано: D_KEY -
            Цитата MyNameIsIgor @
            Разница между не-типом (тайпклассом/концептом) и типом (интерфейсом), при том, что описано это как одна сущность.

            а при чем тут тогда "интерфейсы как в Go"? их "утиность" никак не способствует размыванию разницы между интерфейсами и тайпклассами.

            Цитата D_KEY @
            Зачем :) ?

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

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

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

                  хорошее объяснение, мне нравится. ок, допустим, template у тебя просто как аналог instance в хаскелле. тогда скажи, является ли A наследником I (применительно к первому случаю)?
                    Цитата korvin @
                    ок, допустим, template у тебя просто как аналог instance в хаскелле.

                    Строго говоря, таким аналогом в случае концептов является concept map или тот гипотетический неявный инстанс, который получается, когда тип и так соответствует концепту.

                    Цитата
                    тогда скажи, является ли A наследником I (применительно к первому случаю)?

                    Классы не наследуют от интерфейсов даже по ОО-понятиям ;)
                    Если мы отделяем "интерфейсы"(концепты) от абстрактных ОО-классов, то нет, не является :)
                      Цитата D_KEY @
                      Хорошо:
                      ExpandedWrap disabled
                        concept I a where ...
                         
                        data A = A
                        data B = B
                         
                        instance I A where ...
                        instance I B where ...
                         
                        f1 :: [I]
                        f1 = [A, B] -- работает
                         
                        f2 :: I a => [a]
                        f2 = [A, B] -- не работает

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

                      Добавлено
                      Цитата D_KEY @
                      Классы не наследуют от интерфейсов даже по ОО-понятиям ;)
                      Если мы отделяем "интерфейсы"(концепты) от абстрактных ОО-классов, то нет, не является :)

                      не придирайся к словам, ты понял, что я про субтипирование =)
                        Цитата korvin @
                        теперь что получается, помимо того, что из-за наследования с перекрытием методов мы не можем сказать какой точно код будет выполнен

                        Ты о чем сейчас?
                        И вообще, если ты о С++, ты мы уже давно вышли за рамки его возможностей :)

                        Цитата
                        так еще и в зависимости от типа функции один и тот же объект может выполнить разный код?

                        Чего? Какой один и тот же объект выполнит разный код?
                        И да, [A, B] в первом случае не должно работать - тут должен быть какой-то иной синтаксис :)
                          т.е. смотри:
                          ExpandedWrap disabled
                            concept C a where
                                foo :: a -> Void
                             
                            data A = A where
                                foo :: A -> Void
                                foo x = println "A.foo"
                             
                            instance C A where
                                foo :: A -> Void
                                foo x = println "C A.foo"
                             
                            f1 :: C -> Void
                            f1 x = x.foo
                             
                            f2 :: C A -> Void
                            f2 x = x.foo
                             
                            f1 A -- "A.foo"
                            f2 A -- "C A.foo"

                          ?
                            Цитата korvin @
                            не придирайся к словам, ты понял, что я про субтипирование =)

                            Я немного не согласен с тем, чтобы смешивать абстрактные типы с типами данных. Как раз в Haskell есть типы данных(через алгебраические типы данных) и тайпклассы, которые позволяют описывать интерфейс объекта и абстрагироваться от конкретного типа(т.е. по сути являются средством описания абстрактных типов). Хотя допускаю, что я просто плохо "понял" Haskell.
                              это даже тайпчек не должно проходить =)
                                Цитата korvin @
                                т.е. смотри:
                                ExpandedWrap disabled
                                  concept C a where
                                      foo :: a -> Void
                                   
                                  data A = A where
                                      foo :: A -> Void
                                      foo x = println "A.foo"
                                   
                                  instance C A where
                                      foo :: A -> Void
                                      foo x = println "C A.foo"
                                   
                                  f1 :: C -> Void
                                  f1 x = x.foo
                                   
                                  f2 :: C A -> Void
                                  f2 x = x.foo
                                   
                                  f1 A -- "A.foo"
                                  f2 A -- "C A.foo"

                                ?

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


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