
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.218] |
![]() |
|
Страницы: (33) « Первая ... 24 25 [26] 27 28 ... 32 33 ( Перейти к последнему сообщению ) |
Сообщ.
#376
,
|
|
|
Цитата korvin @ Я не знаю, что там в D, но D_KEY пишет о том, что плюсовый шаблон может иметь специализацию, отличную от обобщенного варианта (перегрузку, в некотором смысле), например: ![]() ![]() template<typename T> int length(vector<T> xs) { return xs.size(); } template<> int length(vector<int> xs) { return 1234; } т.е. для разных типов функция length показывает разное поведение, что является ad-hoc полиморфизмом. ПП-функция же имеет всегда одинаковое поведение для любых типов. Тут у меня нет возражений. Если шаблон специализирован, то тут и правда специальный полиморфизм. Но а если шаблон не специализирован? ![]() ![]() template<typename T> int length(T xs) { return xs.size(); } Это ПП или нет? |
Сообщ.
#377
,
|
|
|
Цитата korvin @ Я не знаю, что там в D, но D_KEY пишет о том, что плюсовый шаблон может иметь специализацию, отличную от обобщенного варианта (перегрузку, в некотором смысле), например: ![]() ![]() template<typename T> int length(vector<T> xs) { return xs.size(); } template<> int length(vector<int> xs) { return 1234; } т.е. для разных типов функция length показывает разное поведение, что является ad-hoc полиморфизмом. ПП-функция же имеет всегда одинаковое поведение для любых типов. Именно так. Добавлено Цитата applegame @ Если шаблон специализирован, то тут и правда специальный полиморфизм. Специализировать его может любой желающий в любой момент времени. Т.е. сам механизм является средством специального полиморфизма. Добавлено Цитата applegame @ Но а если шаблон не специализирован? А если не переопределение виртуальная функция? А если не переопределена дефолтная реализация функции в тайпклассе? Это неважно. Сам механизм остаётся средством специального полиморфизма во всех перечисленных случаях. |
![]() |
Сообщ.
#378
,
|
|
Цитата applegame @ Тут у меня нет возражений. Если шаблон специализирован, то тут и правда ad-hoc полиморфизм. Но а если шаблон не специализирован? А если метод не перекрывать, значит ли это, что он не перекрываем? Если публичный метод не вызывать нигде извне объекта, значит ли это, что он приватный? |
Сообщ.
#379
,
|
|
|
И именно тот факт, что шаблоны являются средством специального полиморфизма и мешает решить ту задачу на C++.
Добавлено Меня, честно говоря, больше всего удивляет тут Rust. Возможно я чего-то не понимаю, но Rust должен справляться с этой задачей, не смотря на генерацию в реализации. |
![]() |
Сообщ.
#380
,
|
|
Обобщённый шаблон --- это как базовый класс с дефолтной реализацией методов. Ты можешь не наследоваться от него и не переопределять методы, но классом он быть не перестаёт и структурой от этого не становится.
|
Сообщ.
#381
,
|
|
|
Цитата korvin @ А сама возможность перекрыть метод говорит о том, что метод параметрически не полиморфный? А если метод не перекрывать, значит ли это, что он не перекрываем? |
![]() |
Сообщ.
#382
,
|
|
Цитата applegame @ А сама возможность перекрыть метод говорит о том, что метод параметрически не полиморфный? Это была параллельная аналогия. Утверждение "Обобщённый шаблон можно не перегружать, следовательно шаблоны --- это ПП." равносильно утверждению "Базовый класс можно не наследовать, следовательно классы --- это структуры." |
Сообщ.
#383
,
|
|
|
Цитата korvin @ Ну а следует ли из того, что обобщенный шаблон можно перегружать, что он --- это не ПП? Это была параллельная аналогия. |
![]() |
Сообщ.
#384
,
|
|
Цитата applegame @ Ну а следует ли из того, что обобщенный шаблон можно перегружать, что он --- это не ПП? ![]() |
Сообщ.
#385
,
|
|
|
Цитата korvin @ Я пытаюсь понять твое мнение. Задам вопрос по другому:![]() Может ли некий частный случай обобщенного шаблона считаться ПП? Добавлено Ведь и в Хаскелле можно в некотором роде "специализировать" уже написанные полиморфные функции. Например для того чтобы мой тип Foo мог участвовать в операциях сложения мне придется написать инстанс Num для Foo, в котором специализировать сложение для этого самомго Foo. Ведь так? |
Сообщ.
#386
,
|
|
|
Цитата applegame @ Может ли некий частный случай обобщенного шаблона считаться ПП? Я вот твоего вопроса не понимаю. Есть механизм шаблонов. Он относится к механизмам специального полиморфизма. Добавлено Цитата applegame @ Например для того чтобы мой тип Foo мог участвовать в операциях сложения мне придется написать инстанс Num для Foo, в котором специализировать сложение для этого самомго Foo. Так? Да, тайпклассы - это вид специального полиморфизма. |
Сообщ.
#387
,
|
|
|
Цитата D_KEY @ Тогда получается, что операция сложения в Хаскелле - параметрически не полиморфна? Или она становится не полиморфной как только я специализирую ее для определенного нового типа? Да, тайпклассы - это вид специального полиморфизма. |
Сообщ.
#388
,
|
|
|
Цитата applegame @ Цитата D_KEY @ Тогда получается, что операция сложения в Хаскелле - параметрически не полиморфна? Или она становится не полиморфной как только я специализирую ее для определенного нового типа?Да, тайпклассы - это вид специального полиморфизма. Да, это специальный полиморфизм. И не только в haskell, но и в C++, когда ты задаешь operator + для своего типа. Перегрузка функций - тоже специальный полиморфизм. |
Сообщ.
#389
,
|
|
|
Цитата D_KEY @ Я думаю, генерация функций в этом деле не играет роли. Ведь важно проверить типы. И как это сделать не разворачивая рекурсию типов до упора? Меня, честно говоря, больше всего удивляет тут Rust. Возможно я чего-то не понимаю, но Rust должен справляться с этой задачей, не смотря на генерацию в реализации. Добавлено Цитата D_KEY @ Дык я могу любую функцию в Haskell специализировать, не только сложение. И что эти функции от этого перестают быть параметрически полиморфными? Тогда не понятно, чем тебе мешает возможность специализировать шаблоны? Да, это специальный полиморфизм. И не только в haskell, но и в C++, когда ты задаешь operator + для своего типа. Перегрузка функций - тоже специальный полиморфизм. Добавлено Хотя нет не любую. Только те, которые в тайп-классах. Добавлено Цитата D_KEY @ Это очевидно. Так же как и виртуальные функции. Перегрузка функций - тоже специальный полиморфизм. |
![]() |
Сообщ.
#390
,
|
|
Цитата applegame @ Я пытаюсь понять твое мнение. Задам вопрос по другому: Может ли некий частный случай обобщенного шаблона считаться ПП? Слово "частный" уже отвечает на вопрос. Моё мнение --- шаблоны являются средством обобщённого программирования, но это другой механизм, нежели ПП. |