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

    что нет? я сделал именно то, что написал. при чем тут контракт?
      Цитата korvin @
      Цитата D_KEY @
      Нет, ты всего-лишь описал некий контракт :)
      А специализация(инстанс) позволяет указать реализацию этого самого контракта.

      что нет? я сделал именно то, что написал. при чем тут контракт?

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

      Добавлено
      korvin, вообще ты по-моему не желаешь понять то, что тебе говорят... Т.е. безконечно требуешь объяснений тому, что можно нагуглить и прочитать за пару минут. Неужели тебе не интересны схожие подходы в разных языках и ты отдаешь предпочтение шаблонным о них(языках) мнениям?
      Следует ли из твоих обвинений traits class и того, что ты не видешь концептуальной разницы между ними и type class, то, что ты так же негативно настроен против type class.Если не следует, то объясни, почему.
      Сообщение отредактировано: D_KEY -
        Цитата D_KEY @
        При том, что ты описал контракт, а не ассоциировал имя с различными определениями. "Различные определения" как раз будут указывать, как данный контракт реализовывается с помощью указанного типа.

        т.е. по ссылке ты не сходил, определение перегрузки не понял?
        еще раз: есть четыре вида полиморфизма:

        универсальный:
        1) параметрический
        2) включение

        специальный:
        3) приведение
        4) перегрузка

        тайпклассы позволяют реализовать перегрузку:
        ExpandedWrap disabled
          class CanBeInt a where
              toInt :: a -> Int
           
          data Eng = One  | Two | Three
          data Rus = Odin | Dva | Tree
           
          instance CanBeInt Eng where -- перегрузка 1 для типа Eng
              toInt x = case x of
                  One   -> 1
                  Two   -> 2
                  Three -> 3
           
          instance CanBeInt Rus where -- перегрузка 2 для типа Rus
              toInt x = case x of
                  Odin -> 1
                  Dva  -> 2
                  Tree -> 3
           
          -- да, в стандартном хаскелле можно перегружать только по одному типу.
          :facepalm:

          Добавлено
          Цитата korvin @
          тайпклассы позволяют реализовать перегрузку:
          ExpandedWrap disabled
            class CanBeInt a where
                toInt :: a -> Int
             
            data Eng = One  | Two | Three
            data Rus = Odin | Dva | Tree
             
            instance CanBeInt Eng where -- перегрузка 1 для типа Eng
                toInt x = case x of
                    One   -> 1
                    Two   -> 2
                    Three -> 3
             
            instance CanBeInt Rus where -- перегрузка 2 для типа Rus
                toInt x = case x of
                    Odin -> 1
                    Dva  -> 2
                    Tree -> 3
             
            -- да, в стандартном хаскелле можно перегружать только по одному типу.

          А теперь попробуй сравнить вот это(аналог твоего кода в С++):
          ExpandedWrap disabled
            template<typename T>
            class CanBeInt {
                int toInt(T data);
            };
             
            enum Eng { One, Two, Three };
            enum Rus { Odin, Dva, Tree };
             
            template<>
            class CanBeInt<Eng> { // "перегрузка" 1 для типа Eng
             
                int toInt(Eng x)
                {
                    switch(x) {
                    case One:   return 1;
                    case Two:   return 2;
                    case Three: return 3;
                    }
                }
            };
             
            template<>
            class CanBeInt<Rus> { // "перегрузка" 2 для типа Rus
             
                int toInt(Rus x)
                {
                    switch(x) {
                    case Odin: return 1;
                    case Dva:  return 2;
                    case Tree: return 3;
                    }
                }
            };


          С этим:
          ExpandedWrap disabled
            enum Eng { One, Two, Three };
            enum Rus { Odin, Dva, Tree };
             
            int toInt(Eng); // перегрузка 1 для типа Eng
            int toInt(Rus); // перегрузка 2 для типа Rus


          Можно, конечно, и первый случай считать перегрузкой, но тут гораздо лучше подходит термин специализация. Впрочем, терминологические споры не очень мне интересны :)

          Добавлено
          Т.е. если ты декларируешь некий интерфейс, а потом создаешь его реализации, то тут мне кажется более уместным термин "специализация"(specialization) или (немного менее точно) инстанцирование(instantiation). Если есть несколько "независимых" объявлений с одним именем, то лучше подходит термин "перегрузка"(overloading). Кстати, в случае перегрузки сходства между перегруженными "объектами" ограничиваются лишь именем.
          Ну а в случае виртуальных функций лучше всего подходит "замещение"(overriding).

          Добавлено
          Хотя исключительно в контексте Haskell, термин "перегрузка", в принципе, подходит(ибо никакой другой перегрузки, кроме специализации тайпклассов нет). Но давай не будем исходить из особенностей конкретных языков.
          Сообщение отредактировано: D_KEY -
            Цитата D_KEY @
            Можно, конечно, и первый случай считать перегрузкой, но тут гораздо лучше подходит термин специализация. Впрочем, терминологические споры не очень мне интересны :)

            в контексте рассуждения о шаблонах ты можешь хоть чем это называть. я говорю о полиморфизме

            Добавлено
            Цитата D_KEY @
            Т.е. если ты декларируешь некий интерфейс, а потом создаешь его реализации, то тут мне кажется более уместным термин "специализация"(specialization) или (немного менее точно) инстанцирование(instantiation). Если есть несколько "независимых" объявлений с одним именем, то лучше подходит термин "перегрузка"(overloading). Кстати, в случае перегрузки сходства между перегруженными "объектами" ограничиваются лишь именем.

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

              в контексте рассуждения о шаблонах ты можешь хоть чем это называть. я говорю о полиморфизме

              Причем тут шаблоны? Это ты почему-то применяешь специфическое для Haskell понимание overloading'а. Даже по твоей ссылке у overloading есть конкретное определение(которое ты сам и привел):
              Цитата
              Overloading is a syntactic abbreviation that associates one function name with a variety of function definitions. The same name can accepts a variety of unrelated sets of types as its arguments

              И я не вижу это в Haskell.
              А вижу я специализации тайпкласса для нужного типа. В чем я не прав? Да, это обеспечивает эмуляцию перегрузки и поскольку в Haskell по другому нельзя, то в контексте этого языка можно так называть, но если мы говорим в контексте языков разных, то это не перегрузка. Я всегда уточняю, если использую специфичную именно для С++ терминологию. Называй это "перегрузкой в стиле Haskell" :)
                так что, предъявляя такое требование, ты "исходишь из особенностей конкретных языков".
                  Цитата korvin @
                  ограничение по типу в Хаскелле связано с системой типов.

                  Все замечательно. Для Haskell. Но не надо термины, верные в контексте одного языка, переносить в контекст межязыкового холивара :)
                  Особенно, если холивар этого языка не касается ;)
                    Цитата D_KEY @
                    Причем тут шаблоны? Это ты почему-то применяешь специфическое для Haskell понимание overloading'а. Даже по твоей ссылке у overloading есть конкретное определение(которое ты сам и привел):
                    Цитата
                    Overloading is a syntactic abbreviation that associates one function name with a variety of function definitions. The same name can accepts a variety of unrelated sets of types as its arguments

                    И я не вижу это в Haskell.

                    ExpandedWrap disabled
                      instance Foo Int where
                          foo x = x
                       
                      instance Foo Double where
                          foo x = x

                    пожалуйста. функция foo определена на множестве несвязаных типов (Int * Double)
                      Цитата korvin @
                      так что, предъявляя такое требование, ты "исходишь из особенностей конкретных языков".

                      Нет, я исхожу из приведенного же тобой определения
                      Цитата
                      Overloading is a syntactic abbreviation that associates one function name with a variety of function definitions.

                      Почему ты считаешь, что тайпклассы, которые могут содержать несколько методов(а не один) и которые могут иметь специализации лишь по одному типу, подходят под это определение, для меня загадка. Да, в контексте Haskell, "перегрузка" именно так и делается(ибо иначе никак). Но это особенность конкретного языка.

                      Добавлено
                      korvin, давай забьем на термины, ты вроде хотел переписать код из статьи на яве(и мб на Haskell).
                        Цитата D_KEY @
                        korvin, давай забьем на термины, ты вроде хотел переписать код из статьи на яве(и мб на Haskell).

                        нет, переписывать дословно я не хотел, решить задачу был бы непротив, но за всеми этими плюсовыми фишками я не вижу в чем заключается задача =/
                        ну допустим:
                        ExpandedWrap disabled
                          -- так будут представлены значения, полученные из буфера:
                          -- (можно было бы обойтись стандартным типом Maybe)
                          data Value a = Val a | EOF deriving (Show, Read, Eq)
                           
                           
                          -- класс для различных буферов:
                          class StreamBuffer a where
                              sgetc :: a b -> (Value b, a b)
                              sgetn :: a b -> b -> Int -> Int -- хз, что эта функция должна делать

                        ExpandedWrap disabled
                          -- наша кастомная реализация, например через списки:
                          data Buffer a = Buffer [a] deriving (Show, Read, Eq)
                           
                          instance StreamBuffer Buffer where
                              sgetc (Buffer   []  )  =  (EOF  , Buffer [])
                              sgetc (Buffer (x:xs))  =  (Val x, Buffer xs)
                              
                              sgetn _ _ n  =  n
                        Сообщение отредактировано: korvin -
                          Т.е. будем делать полную реализацию для каждого типа? Великолепно :)
                            полную реализацию чего?
                              Цитата korvin @
                              полную реализацию чего?

                              StreamBuffer'а :)
                              И я не понимаю, как твой код решает проблему работы с разными символами и разными характеристиками. Ты опять же решаешь узкую конкретную проблему с EOF(или другими специальными символами). И то не полностью - приходится полностью специализировать StreamBuffer даже если изменился только EOF.
                              Кстати, а если тебе понадобится дополнительно функция сравнения символов?

                              Добавлено
                              korvin, может на яве тоже? Все-таки к теме ближе :)
                                Цитата D_KEY @
                                StreamBuffer'а :)
                                И я не понимаю, как твой код решает проблему работы с разными символами и разными характеристиками. Ты опять же решаешь узкую конкретную проблему с EOF(или другими специальными символами).

                                а зачем ему это решать? в чем проблема-то заключается? в какой из функций буффера (sgetc, sgetn)?

                                Цитата D_KEY @
                                И то не полностью - приходится полностью специализировать StreamBuffer даже если изменился только EOF.

                                в каком месте он изменится? он константа типа (Value a).

                                Цитата D_KEY @
                                Кстати, а если тебе понадобится дополнительно функция сравнения символов?

                                где и зачем?

                                Добавлено
                                Цитата D_KEY @
                                korvin, может на яве тоже? Все-таки к теме ближе :)

                                рано, я еще не вижу проблему
                                ExpandedWrap disabled
                                  public interface StreamBuffer<A> {
                                      
                                      public static final Object EOF = null;
                                      
                                      public A get();
                                      public int get(A c, int n);
                                  }
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 370 371 [372] 373 374 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.5235 ]   [ 14 queries used ]   [ Generated: 30.07.26, 21:24 GMT ]