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

      Нельзя. Попробуй специализировать
      ExpandedWrap disabled
        map :: (a -> b) -> [a] -> [b]


      Цитата applegame @
      Например для того чтобы мой тип Foo мог участвовать в операциях сложения мне придется написать инстанс Num для Foo, в котором специализировать сложение для этого самомго Foo. Ведь так?

      Так, и это не имеет отношения к ПП. Это два разных механизма. Также как ПП и классы в Ocaml, F#, Scala, например.
        Цитата applegame @
        И как это сделать не разворачивая рекурсию типов до упора?

        Так же, как в java, c# и haskell.

        Цитата
        Хотя нет не любую. Только те, которые в тайп-классах.

        Именно так, да. И это специальный полиморфизм.

        Добавлено
        Цитата D_KEY @
        Цитата applegame @
        И как это сделать не разворачивая рекурсию типов до упора?

        Так же, как в java, c# и haskell.

        Как и в этих языках, в Rust дженерики являются средством ПП. И в rust нет перегрузки функций и специализации дженерик функций/типов.
          Интересное кино. Читаем на https://wiki.haskell.org/Polymorphism:
          Цитата
          Parametric polymorphism refers to when the type of a value contains one or more (unconstrained) type variables, so that the value may adopt any type that results from substituting those variables with concrete types.
          In Haskell, this means any type in which a type variable, denoted by a name in a type beginning with a lowercase letter, appears without constraints (i.e. does not appear to the left of a =>).

          Смотрим на код задачи:
          ExpandedWrap disabled
            module Test where
            data Nil = Nil
            data Cons a = Cons Integer a
            class ScalarProduct a where scalarProduct :: a -> a -> Integer
            instance ScalarProduct Nil where scalarProduct Nil Nil = 0
            instance ScalarProduct a => ScalarProduct (Cons a) where scalarProduct (Cons n1 a1) (Cons n2 a2) = n1 * n2 + scalarProduct a1 a2
            main :: Integer -> Integer
            main n = main' n 0 Nil Nil where
              main' :: ScalarProduct a => Integer -> Integer -> a -> a -> Integer
              main' 0 _ as bs = scalarProduct as bs
              main' n i as bs = main' (n-1) (i+1) (Cons (2*i+1) as) (Cons (i^2) bs)
          Таки получается, что функция main' - не полиморфна, так как есть ограничение ScalarProduct a.

          Добавлено
          И еще вот. Паттерн-матчинг в Хаскеле - это ad-hoc полиморфизм?
            Цитата applegame @
            Таки получается, что функция main' - не полиморфна, так как есть ограничение ScalarProduct a.

            Не параметрически полиморфна, да. Я тебе это сказал ещё про твой первый пример.

            Цитата applegame @
            И еще вот. Паттерн-матчинг в Хаскеле - это ad-hoc полиморфизм?

            Паттерн-матчинг вообще никакого отношения к какому бы то ни было полиморфизму не имеет, это (почти) обычный switch/case.
            Сообщение отредактировано: korvin -
              Цитата korvin @
              Паттерн-матчинг вообще никакого отношения к какому бы то ни было полиморфизму не имеет, это (почти) обычный switch/case.
              По типу паттерн-матчинга не бывает?

              Добавлено
              Вернемся к жабе. Как там разруливается полиморфная рекурсия и возможна ли реализация такой возможности в C++?
                Цитата applegame @
                По типу паттерн-матчинга не бывает?

                Нет.

                Добавлено
                Цитата applegame @
                полиморфная рекурсия

                Что это?
                  Цитата korvin @
                  Что это?
                  - https://en.wikipedia.org/wiki/Polymorphic_recursion
                  То самое обо что спотыкаются решения задачи на C++/D/Rust.
                  Сообщение отредактировано: applegame -
                      D даже сам тип Nested не осиливает :D
                        Цитата D_KEY @
                        trait в Rust вполне тип.
                        Тут можно поспорить. Как по мне, то растовые трейты просто выступают одновременно и "тайпклассами" и "интерфейсами".

                        Цитата D_KEY @
                        Меня, честно говоря, больше всего удивляет тут Rust. Возможно я чего-то не понимаю, но Rust должен справляться с этой задачей, не смотря на генерацию в реализации.
                        Каким образом?

                        Вообще я пытался решить задачу немного иначе, но всё так же безуспешно. Ну и находил обсуждение этой проблемы - так там тоже склонялись к тому, что оно не особо нужно. Вот ещё информация по теме.
                          Я бы не очень доверял этой информации касательно выводов.
                          Цитата
                          The key disadvantage of monomorphizing code is that destroys separate compilation. In particular, it's impossible to compile a polymorphic library (say, the list library) separate from the clients.
                          Экспорт шаблонов, т.е. модель разделения, был реализован в Плюсах самым первым, т.е. до модели включения, что и послужило основной причиной оставить его в C++98. Но даже и без экспорта создание библиотек более чем возможно. Только нафик не нужно, ибо жутко неудобно.
                            Цитата DarkEld3r @
                            Вот ещё информация по теме.

                            Весьма интересная информация. Авторы этого документа считают, что мономорфизация - это реализация полиморфизма, со своими преимуществами и недостатками. И, внезапно, MLton - компилятор Standard ML тоже использует мономорфизацию. И, насколько я понял, Standard ML не поддерживает полиморфную рекурсию.

                            Добавлено
                            Цитата Qraizer @
                            Экспорт шаблонов, т.е. модель разделения, был реализован в Плюсах самым первым, т.е. до модели включения, что и послужило основной причиной оставить его в C++98. Но даже и без экспорта создание библиотек более чем возможно. Только нафик не нужно, ибо жутко неудобно.
                            Ну это все же полумера. Экспортировать шаблон целиком никак нельзя, только конечное число его специализаций.
                              Цитата applegame @
                              D даже сам тип Nested не осиливает :D

                              А ты чего ожидал?

                              Добавлено
                              Цитата DarkEld3r @
                              Цитата D_KEY @
                              trait в Rust вполне тип.
                              Тут можно поспорить. Как по мне, то растовые трейты просто выступают одновременно и "тайпклассами" и "интерфейсами".

                              Это интерфейсы(которые в Rust типы), которые можно использовать для ограничения дженериков(как и в Java, например).

                              Добавлено
                              Цитата DarkEld3r @
                              Цитата D_KEY @
                              Меня, честно говоря, больше всего удивляет тут Rust. Возможно я чего-то не понимаю, но Rust должен справляться с этой задачей, не смотря на генерацию в реализации.
                              Каким образом?

                              Поскольку сами правила типизации в языке не содержат ничего, что бы заставляло инстанцировать типы бесконечно, можно тайпчекать без рекурсивного инстанцирования, как в Java. А вот при генерации кода, если возможно и нужно, генерировать специализации. Подобные рекурсивные штуки в принципе, ни в каком из языков, не смогут использовать данные на стеке, то нам все равно понадобится куча и хранить мы так или иначе будем ссылки, а значит можно обойтись без генерации инстансов.
                                Цитата D_KEY @
                                А ты чего ожидал?
                                На самом деле поддержку таких типов (по крайней мере классов) мржно реализовать не ломая текущие спеки. MLton такое осиливает путем ленивого разворачивания шаблонов. В D можно было бы разворачивать шаблон класса, только если этот тип реально используется в программе.
                                Цитата D_KEY @
                                Поскольку сами правила типизации в языке не содержат ничего, что бы заставляло инстанцировать типы бесконечно.
                                Да вроде как DarkEld3r говорил, что содержат. Тем не менее Rust вполне себе параметрически полиморфен, как и C++/D. А эта ваша полиморфная рекурсия, на самом деле, никому не сдалась.
                                Сообщение отредактировано: applegame -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (33) « Первая ... 25 26 [27] 28 29 ...  32 33


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,1112 ]   [ 15 queries used ]   [ Generated: 21.07.25, 10:05 GMT ]