
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.218] |
![]() |
|
Страницы: (33) « Первая ... 15 16 [17] 18 19 ... 32 33 ( Перейти к последнему сообщению ) |
Сообщ.
#241
,
|
|
|
Возможно. А может ты хотел вызывать метод того же класса, в котором пишешь метод foo, а может еще чего-нибудь. Цитата Что значит полиморфный тип? Кто-нибудь может дать внятное определение Вот, например https://www.haskell.org/tutorial/goodies.html Цитата Haskell also incorporates polymorphic types---types that are universally quantified in some way over all types. Polymorphic type expressions essentially describe families of types. For example, (forall a)[a] is the family of types consisting of, for every type a, the type of lists of a. Lists of integers (e.g. [1,2,3]), lists of characters (['a','b','c']), even lists of lists of integers, etc., are all members of this family. (Note, however, that [2,'b'] is not a valid example, since there is no single type that contains both 2 and 'b'.) Добавлено Ну и полиморфная функция аналогично. |
Сообщ.
#242
,
|
|
|
Цитата D_KEY @ И что именно здесь не подходит к шаблонам? Ну кроме названия языка Вот, например ![]() |
Сообщ.
#243
,
|
|
|
Цитата applegame @ Цитата D_KEY @ И что именно здесь не подходит к шаблонам?Вот, например Я уже говорил 100500 раз. Инстанс шаблона зависит от конкретных значений параметров шаблонов. Тип совершенно никак не связан с шаблоном, который его породил. Спор абсолютно бесполезен, это давно видно. |
Сообщ.
#244
,
|
|
|
Цитата D_KEY @ В твоей цитате ничего нет об инстансах, конкретных значениях и т.д. и т.п. Ты мне напиши, что-то вроде: "полиморфный тип - это нечто обладающее такими-то свойствами и вот это свойство отсутствует в шаблонах C++". Я уже говорил 100500 раз. Инстанс шаблона зависит от конкретных значений параметров шаблонов. Тип совершенно никак не связан с шаблоном, который его породил. Спор абсолютно бесполезен, это давно видно. |
Сообщ.
#245
,
|
|
|
Цитата applegame @ В твоей цитате ничего нет об инстансах, конкретных значениях и т.д. и т.п. Ты спросил, что такое полиморфный тип. Цитата Ты мне напиши, что-то вроде: "полиморфный тип - это нечто обладающее такими-то свойствами и вот это свойство отсутствует в шаблонах C++". Это следует из определения параметрического полиморфизма. В котором четко сказано, что зависимости быть не должно. Добавлено Цитата applegame @ В твоей цитате ничего нет об инстансах, конкретных значениях и т.д. и т.п. Можешь начать с того, что полиморфный тип - это тип, а полиморфная функция - это функция. Шаблон типа/функции в С++ не является типом/функцией. |
Сообщ.
#246
,
|
|
|
Цитата D_KEY @ Зависимости кода от типа? Ну дык в шаблоне без специализации или перегрузки один код для всех типов. Ты говоришь, что компилятор C++ создает в бинарном конечном файле несколько вариантов функций. Ну дык я тебе гарантирую, что компилятор Хаскеля в случае функции суммирования двух переменных тоже создаст несколько разных функций в бинарном файле в зависимости от типа. Это следует из определения параметрического полиморфизма. В котором четко сказано, что зависимости быть не должно. Добавлено Цитата D_KEY @ Правда? Ну тогда скажи мне bar- это функция или шаблон? И является ли тип переменной b - типом?Шаблон типа/функции в С++ не является типом/функцией. ![]() ![]() int a = bar(b); Добавлено Кстати, считаешь ли ты функцию printf - параметрически полиморфной? ![]() |
Сообщ.
#247
,
|
|
|
Я его видел.
![]() В любом случае, не получится. Раст тоже будет бесконечно пытаться выводить типы. |
Сообщ.
#248
,
|
|
|
Все, ща D_KEY заявит, что в Rust нет настоящего полиморфизьма! А причина очевидна: В Rust нет виртуальной машины, поэтому он не умеет инстанцировать свои дженерики в run-time как C#. Теперь по D_KEY получается еще, что в Rust и дженериков-то нет, а есть недошаблоны. Буга-гашеньки.
|
Сообщ.
#249
,
|
|
|
Цитата applegame @ Ну дык в шаблоне без специализации или перегрузки один код для всех типов. Не будет. Цитата Ты говоришь, что компилятор C++ создает в бинарном конечном файле несколько вариантов функций. Нет, я говорю о том, что он генерирует функции/типы(сущности языка). Цитата Ну дык я тебе гарантирую, что компилятор Хаскеля в случае функции суммирования двух переменных тоже создаст несколько разных функций в бинарном файле в зависимости от типа. Это аспект реализации. Если бы он так не делал, ничего бы в языке не поменялось. А в C++ поменялось бы. В этом и разница. Цитата Цитата D_KEY @ Правда? Ну тогда скажи мне bar- это функция или шаблон? И является ли тип переменной b - типом?Шаблон типа/функции в С++ не является типом/функцией. ![]() ![]() int a = bar(b); Какое это имеет отношение к теме? Цитата Кстати, считаешь ли ты функцию printf - параметрически полиморфной? ![]() Классическую сишную? Нет. |
Сообщ.
#250
,
|
|
|
Цитата applegame @ Ну дык в шаблоне без специализации или перегрузки один код для всех типов. Нет, не один. Ещё раз: Стандарт требует генерироваться специализации. Потому если программист не написал пользовательскую специализацию, то компилятор сгенерирует свою. Получается специальный полиморфизм на стероидах. |
Сообщ.
#251
,
|
|
|
Цитата applegame @ Все, ща D_KEY заявит, что в Rust нет настоящего полиморфизьма! В случае сырого языка такие выводы делать тяжело. Вопрос в том, является ли это требованием языка, как в C++. Или это бага в реализации. Цитата А причина очевидна: В Rust нет виртуальной машины, поэтому он не умеет инстанцировать свои дженерики в run-time как C#. run-time и инстанцирование тут ни при чем. В Java его нет(по крайней мере раньше не было). В haskell и ocaml нет виртуальной машины, а полиморфные типы есть. Добавлено Цитата DarkEld3r @ Раст тоже будет бесконечно пытаться выводить типы. Этого требует спецификация языка? Или это особенность реалиазации? Насколько я понимаю, Rust'у ничего не мешает работать более умно. Это в языке ничего не сломает. |
Сообщ.
#252
,
|
|
|
Цитата MyNameIsIgor @ Следует ли из этого, что если вдруг в стандарт Хаскеля введут требование генерить специализации (а он по факту во многих случаех их неявно генерит), то Хаскель внезапно перестанет поддерживать ПП?Нет, не один. Ещё раз: Стандарт требует генерироваться специализации. Потому если программист не написал пользовательскую специализацию, то компилятор сгенерирует свою. Получается специальный полиморфизм на стероидах. Цитата D_KEY @ Да ну конечно, В жабе автоматическое затирание типов. В плюсах опять же тоже можно сделать затирание, но вручную.run-time и инстанцирование тут ни при чем. В Java его нет(по крайней мере раньше не было). Цитата D_KEY @ Я точно не знаю как Хаскель и OCaml реализуют рекурсивные специализации, скорее всего затирают тип как жаба. В haskell и ocaml нет виртуальной машины, а полиморфные типы есть. |
Сообщ.
#253
,
|
|
|
Цитата applegame @ Следует ли из этого, что если вдруг в стандарт Хаскеля введут требование генерить специализации (а он по факту во многих случаех их неявно генерит), то Хаскель внезапно перестанет поддерживать ПП? Если он потребует генерировать бинарный код для оптимизации, без изменения системы типов, то не перестанет. Потому отсылки к реализации не к месту. Если же при этом изменится и система типов по типу плюсовой, то да, перестанет. |
Сообщ.
#254
,
|
|
|
Цитата applegame @ Следует ли из этого, что если вдруг в стандарт Хаскеля введут требование генерить специализации (а он по факту во многих случаех их неявно генерит) Смотря как генерить ![]() Цитата В плюсах опять же тоже можно сделать затирание, но вручную. Потеряв таки типобезопасность. Это не считается ![]() |
Сообщ.
#255
,
|
|
|
Я в принципе понимаю мысль MyNaneIsIgor. Прописывание в стандарте C++ требований об обязательной специализации ограничивает применимость ПП в C++. Если мы в стандарте C++ разрешим в некоторых случаях не генерить специализации, а выкручиваться другими способами (например затирая тип или даже интерпретируя код шаблона), то это уже будет не современный C++, а например C++20, который по D_KEY наконец-то станет поддерживать ПП.
|