
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.218] |
![]() |
|
Страницы: (33) « Первая ... 23 24 [25] 26 27 ... 32 33 ( Перейти к последнему сообщению ) |
![]() |
Сообщ.
#361
,
|
|
Цитата applegame @ она мне доказывает, что я не могу выполнить метод test для объекта с типом Foo, что является ложью. А вот система типов C++/D с такой задачей справляется. Этот пример наглядно демонстрирует подход "Со своим уставом в чужой монастырь". Это, по факту, копипаста из C++, которая внезапно не работает в другом языке. |
Сообщ.
#362
,
|
|
|
Цитата Da$aD @ A этот пример наглядно демонстрирует, что вы не понимаете о чем идет речь. А речь идет явно не о C++ vs Java. Этот пример наглядно демонстрирует подход "Со своим уставом в чужой монастырь". Это, по факту, копипаста из C++, которая внезапно не работает в другом языке. |
Сообщ.
#363
,
|
|
|
Кажется я достиг дзен. Если заблуждаюсь поправьте.
Итак, рассуждения в контексте Java: Долго думал как оно вообще работает. Дело в том, что просто стирания типов явно недостаточно для компиляции кода той самой задачи. Стирание типов позволяет нам создать один-единственный экземпляр функции, работающий с, грубо говоря, void*. Но что делать с бесконечной генерацией типов, которая, казалось бы необходима для проверки типов compile-time? И вот тут, как я полагаю, происходит самое интересное: компилятор определяет, что доказать правильность использования этой бесконечной последовательности типов (допустим A<A<A<A....) можно доказав утверждение: если для любого типа T верен тип A<T>, то также будет верент тип A<A<T>>. Тогда можно не разворачивать в бесконечность типы - все равно в run-time все сведется к void*. Подозреваю, что в каких-то случаях компилятор жабы может лажать и таки ударяться в бесконечное разворачивание. Но не буду утвержать. Что касается C++/D, то такую оптимизацию мы делать не можем из-за требования разворачивать типы до упора. |
![]() |
Сообщ.
#364
,
|
|
Цитата applegame @ Бида, печаль. В жабе для того что бы ПП-функция могла принимать несколько разных типов, мы вынуждены создать дополнительный тип с "общим" методом и от него унаследоваться. Но тогда получается, что наша ПП-функция де-факто принимает параметр одного типа: На самом деле бида-пичаль в том, что в твоём примере нет никакого ПП. Твой пример почти полностью соответствует этому. Никакого ПП здесь нет. Вот это ПП: Haskell, Java. Конечно в джаве не всё так гладко, но ты можешь взять Scala, например. |
Сообщ.
#365
,
|
|
|
Цитата korvin @ До-о-о. Бида и пичаль, что и в Haskell невозможно обойтись без лишнего типа. В твоем варианте - класс Test, которым ты объединил Foo и Bar. К счастью в Haskell - это делается куда изящнее чем в жабе. На самом деле бида-пичаль в том, что в твоём примере нет никакого ПП. |
![]() |
Сообщ.
#366
,
|
|
Цитата applegame @ До-о-о. Бида и пичаль, что и в Haskell невозможно обойтись без лишнего типа. В твоем варианте - класс Test, которым ты объединил Foo и Bar. К счастью в Haskell - это делается куда изящнее чем в жабе. Какого "лишнего типа"? Во-первых, там нет никакого лишнего типа, во-вторых, ты, похоже, вообще не понимаешь, что такое ПП. |
Сообщ.
#367
,
|
|
|
Цитата applegame @ Цитата korvin @ До-о-о. Бида и пичаль, что и в Haskell невозможно обойтись без лишнего типа. В твоем варианте - класс Test, которым ты объединил Foo и Bar. К счастью в Haskell - это делается куда изящнее чем в жабе.На самом деле бида-пичаль в том, что в твоём примере нет никакого ПП. class в haskell - это тайпкласс, а не тип. |
Сообщ.
#368
,
|
|
|
![]() |
Сообщ.
#369
,
|
|
Цитата applegame @ Цитата D_KEY @ Как говориться, тот же тип - вид сбоку.class в haskell - это тайпкласс, а не тип. ![]() |
Сообщ.
#370
,
|
|
|
Скомпилируется, потому, что сгенерированный код не будет содержать ошибок. Это не значит, что плюсы что-то там выводят ![]() Цитата она мне доказывает, что я не могу выполнить метод test для объекта с типом Foo, что является ложью. Ты читаешь сообщения компилятора? Ты не можешь выполнить метод test для объекта типовой переменной T, потому, что тебе о типе ничего неизвестно(в случае чистого ПП и не должно). И именно об этом тебе скажет компилятор. Ругаться он будет и без Foo и Bar. Они в твоём примере не нужны. Ты мешаешь в одну кучу ПП и специальный полиморфизм. |
Сообщ.
#371
,
|
|
|
Цитата korvin @ Пардон, попутал примеры. Какого "лишнего типа"? Во-первых, там нет никакого лишнего типа, |
![]() |
Сообщ.
#372
,
|
|
Куда? Пропиши все типы явно, без auto и alias. А то я тоже могу в исходнике на Хаскелле убрать все типы, но мы тут не вывод типов обсуждаем. |
Сообщ.
#373
,
|
|
|
Цитата applegame @ Как говориться, тот же тип - вид сбоку. Нет. Это тайпкласс ![]() Цитата Похоже на traits из Rust, который тоже, как бы не тип ![]() Скорее похоже на плюсовые концепты, которые не типы. trait в Rust вполне тип. Цитата Но, как только мы пишем аналог на D, то ПП магически исчезает. ![]() Это имитация. Я же могу специализировать transform? Значит это вид специального полиморфизма, просто конкретно в твоём случае ты используешь только реализацию по умолчанию. |
Сообщ.
#374
,
|
|
|
Цитата D_KEY @ Все верно. Но тип знать и не требуется. Требуется знать, поддерживает тип какую-либо операцию или нет. Ты не можешь выполнить метод test для объекта типовой переменной T, потому, что тебе о типе ничего неизвестно(в случае чистого ПП и не должно). Добавлено Цитата korvin @ Откуда, я знаю. Спроси у D_KEY. Куда? ![]() Цитата korvin @ alias и auto просто для удобства. Они роли не играют. Пропиши все типы явно, без auto и alias. А то я тоже могу в исходнике на Хаскелле убрать все типы, но мы тут не вывод типов обсуждаем. Добавлено Цитата D_KEY @ А можешь и не специализировать, тогда это не будет видом специального полиморфизма Я же могу специализировать transform? Значит это вид специального полиморфизма ![]() |
![]() |
Сообщ.
#375
,
|
|
Цитата applegame @ По D_KEY исчезают. alias и auto просто для удобства. Они роли не играют. Я не знаю, что там в 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 полиморфизмом. ПП-функция же имеет всегда одинаковое поведение для любых типов. |