Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.223.20.57] |
|
Страницы: (33) « Первая ... 28 29 [30] 31 32 ... Последняя » ( Перейти к последнему сообщению ) |
Сообщ.
#436
,
|
|
|
Цитата TAPL Параметрический полиморфизм (parametric polymorphism), позволяет придать участку кода «обобщенный» тип, используя переменные вместо настоящих типов, а затем конкретизировать, замещая эти переменные типами. Параметрические определения однородны: все экземпляры данного фрагмента кода ведут себя одинаково. Цитата TAPL Специализированный полиморфизм (ad-hoc polymorphism), напротив, позволяет полиморфному значению демонстрировать различное поведение при его «рассмотрении» относительно разных типов. Самый обычный пример специализированного полиморфизмаперегрузка (overloading), когда один и тот же символ функции соответствует различным реализациям; компилятор (или система времени выполнения, взависимостиоттого,идетлиречьостатическом(static)или динамическом (dynamic) разрешении перегрузки) выбирает подходящую реализацию для каждого случая применения функции, исходя из типов ее аргументов. К какому из них относятся шаблоны? |
Сообщ.
#437
,
|
|
|
Цитата D_KEY @ Я же уже писал. Шаблоны слишком общее понятие. Ими можно городить и PP и ad-hoc. К какому из них относятся шаблоны? |
Сообщ.
#438
,
|
|
|
Они могут быть в одном языке, но они не могут обеспечиваться одним механизмом, т.к. противоположны. |
Сообщ.
#439
,
|
|
|
Попробую объяснить Qraizer'у на его языке: ты много радел за инварианты в споре с делфишниками, так вот
length :: [a] -> Int -- это инвариант, функция length всегда должна правильно подсчитывать длину списка. А код template<> int length(vector<int> xs) { return 0; } этот инвариант нарушает. ПП (в Хаскелле, Джаве и других ЯП) позволяют гарантировать этот инвариант (может я слово неправильно употребил, но, думаю, ты понял суть). В плюсах же шаблоны этой гарантии не дают. |
Сообщ.
#440
,
|
|
|
Цитата D_KEY @ Я считаю так: если оно на уровне исходного кода одинаково для всех типов, то параметрическое, если разное, то специальное. Они могут быть в одном языке, но они не могут обеспечиваться одним механизмом, т.к. противоположны. |
Сообщ.
#441
,
|
|
|
Цитата applegame @ Ими можно городить и PP и ad-hoc. А не получается ли у тебя, что чуть ли не любой ad-hoc может выразить ПП? |
Сообщ.
#442
,
|
|
|
Цитата applegame @ Я же уже писал. Шаблоны слишком общее понятие. Ими можно городить и PP и ad-hoc. Пока нельзя в хэдере написать сигнатуру, а в cpp-файле --- реализацию, скомпилировать его отдельно, и юзать эту функцию, это не ПП, а Сишые макросы (с некоторыми бонуами), не более. |
Сообщ.
#443
,
|
|
|
Цитата applegame @ Цитата D_KEY @ Я считаю так: если оно на уровне исходного кода одинаково для всех типов, то параметрическое, если разное, то специальное.Они могут быть в одном языке, но они не могут обеспечиваться одним механизмом, т.к. противоположны. Но ведь в любой момент кто-то может специализировать тот или иной шаблон. Т.е. ты не можешь сказать, есть ли ПП в коде, пока весь его не рассмотришь и установить, есть ли специализация(или более сложные случаи разного поведения для разных типов)? |
Сообщ.
#444
,
|
|
|
Цитата applegame @ Я считаю так: если оно на уровне исходного кода одинаково для всех типов, то параметрическое, если разное, то специальное. В этом и проблема: исходный код никому не интересен. Суть древнего процедурного программирования в использовании процедуры без анализа её исходного кода, а ты предлагаешь вернуться в каменный век. |
Сообщ.
#445
,
|
|
|
Цитата korvin @ это не ПП Да, не ПП Цитата а Сишые макросы (с некоторыми бонуами), не более. Нет |
Сообщ.
#446
,
|
|
|
Цитата korvin @ Не понял вброса. Никакой это не инвариант. Это библиотечная функция в Prelude. Вот полюбуйся:Попробую объяснить Qraizer'у на его языке: ты много радел за инварианты в споре с делфишниками, так вот length :: [a] -> Int -- это инвариант, функция length всегда должна правильно подсчитывать длину списка. http://ideone.com/UtXgp5 Добавлено Цитата korvin @ То есть в ML нет ПП. Так и запишем. Пока нельзя в хэдере написать сигнатуру, а в cpp-файле --- реализацию, скомпилировать его отдельно, и юзать эту функцию, это не ПП, а Сишые макросы (с некоторыми бонуами), не более. Добавлено Цитата korvin @ Ну тогда у нас везде ad-hoc по определению. x86 процессоры пока не научились одним и тем же кодом складывать float и int. В этом и проблема: исходный код никому не интересен. |
Сообщ.
#447
,
|
|
|
Шаблоны представляют собой тесно интегрированный в язык механизм генерации кода, с возможностью задания дефолтной реализации и возможностью специализировать своё поведение для того или иного набора параметров(или части параметров и т.п.). Где тут параметрический полиморфизм? Ad-hoc. И только.
|
Сообщ.
#448
,
|
|
|
Цитата D_KEY @ Да.Шаблоны представляют собой тесно интегрированный в язык механизм генерации кода, с возможностью задания дефолтной реализации и возможностью специализировать своё поведение для того или иного набора параметров(или части параметров и т.п.) Цитата D_KEY @ PP by ad-hoc, да. Так тоже бывает. Например в ML. Где тут параметрический полиморфизм? Ad-hoc. И только. |
Сообщ.
#449
,
|
|
|
Цитата applegame @ Не понял вброса. Никакой это не инвариант. Это библиотечная функция в Prelude. Вот полюбуйся: http://ideone.com/UtXgp5 То есть в ML нет ПП. Так и запишем. Самый, что ни на есть, прямой. Результат функции length никак не зависит от типа элементов списка, в отличие от. Ты просто убрал стандартную функцию length. Твоя будет выдавать 0 для _любого_ списка, пусть в нм хоть Int будет, хоть Double, хоть String. Ты не можешь определить в одном модуле две length для разных типов в рамках ПП. Лолшто? В ML сигнатуры более чем отделены от реализации. Я уж не говорю про параметризуемые модули(функторы). |
Сообщ.
#450
,
|
|
|
Цитата applegame @ Цитата D_KEY @ PP by ad-hoc, да. Так тоже бывает. Например в ML.Где тут параметрический полиморфизм? Ad-hoc. И только. В ml нельзя специализировать. Там ПП, потому что есть однородность(см. выше цитаты из TAPL). |