Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.192] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 360 361 [362] 363 364 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#5416
,
|
|
|
|
По-моему, просто синтаксис концептов не позволяет удобно описать и параметр шаблона, и интерфейс, согласись. Для этого нужно что-то другое |
|
Сообщ.
#5417
,
|
|
|
|
Цитата MyNameIsIgor @ По-моему, просто синтаксис концептов не позволяет удобно описать и параметр шаблона, и интерфейс, согласись Соглашусь Я и не утверждал, что подходит... |
|
Сообщ.
#5418
,
|
|
|
|
потому что мы не можем просто использовать первый код, там мы работаем с конкретным типом, с его внутренним представлением, без посредников. во втором случае мы работаем просто с интерфейсом Plus, о его внутренней структуре мы ничего не знаем, следовательно должны приводить его к какому-то промежуточному значению. т.е. в первом случае мы складываем, например, рубли с рублями, а во втором -- рубли с некоторой валютой, которую приводим к какой-то универсальной валюте. тот код даже нужно подправить так: ![]() ![]() interface Plus { Plus add(Plus); Intermediate toIntermediate(); } class Int implements Plus { int value = 0; public Int() {} public Int(Intermediate x) { ... } public Plus add(Plus y) { return Int(this.toIntermediate + y.toIntermediate); } } в итоге, мы придем к тому, что интерфейсы вообще окажутся ненужными и мы вполне можем обойтись тайпклассами. |
|
Сообщ.
#5419
,
|
|
|
|
korvin, давайте я попробую переписать код так
![]() ![]() // Концепт/интерфейс, параметризируется неким типом concept Plus<class T> { T operator+ (T, T); } // Шаблонная функция template<class T> requares Plus<T> // Требуем, чтобы для типа T выполнялся концепт Plus, т.е. существовал operator+ (T, T) T f(T x, T y) { return x + y; } Plus<int> f(Plus<int> x, Plus<int> y) // Здесь уже Plus - это интерфейс, а int - то самое промежуточное представление { return x + y; } Ещё раз хочется отметить: на мой взгляд, здесь дело в синтаксисе, он вносит путаницу, а не в идее. Я просто неудачно выбрал концепты для её иллюстрации, ничего более подходящего в голову не лезет. |
|
Сообщ.
#5420
,
|
|
|
|
Цитата korvin @ т.е. в первом случае мы складываем, например, рубли с рублями, а во втором -- рубли с некоторой валютой, которую приводим к какой-то универсальной валюте. А чем тебя не устроит кинутое исключение в операторе + конкретного типа при обнаружении, что аргумент метода имеет какой-то другой тип? Так ведут себя все динамические языки. Цитата в итоге, мы придем к тому, что интерфейсы вообще окажутся ненужными и мы вполне можем обойтись тайпклассами. В данном случае - да. Но мне интересно, что ты собираешься делать, если тебе захочется динамического связывания и замены типов объектов в рантайме? Не придется ли писать все тоже самое для интерфейса, что ты уже написал для тайпкласса? |
|
Сообщ.
#5421
,
|
|
|
|
Цитата D_KEY @ А чем тебя не устроит кинутое исключение в операторе + конкретного типа при обнаружении, что аргумент метода имеет какой-то другой тип? Проблема в том, что если интерфейсы имеют утиную типизацию, то их реализация может даже не предполагать, что ей будет передан какой-то неподходящий тип. |
|
Сообщ.
#5422
,
|
|
|
|
Цитата MyNameIsIgor @ Цитата D_KEY @ А чем тебя не устроит кинутое исключение в операторе + конкретного типа при обнаружении, что аргумент метода имеет какой-то другой тип? Проблема в том, что если интерфейсы имеют утиную типизацию, то их реализация может даже не предполагать, что ей будет передан какой-то неподходящий тип. В случае настолько сильной утиности, тебе придется проводить такую проверку в любом случае на уровне рантайма языка. |
|
Сообщ.
#5423
,
|
|
|
|
Цитата D_KEY @ Нет, только тот, для которого есть инстанс. Если инстанса нет, то аргумент не пройдет о чем нам сообщит компилятор, и мы определим инстанс для любого типа, любого класса типов. Цитата D_KEY @ точно также, как в случае утиных интерфейсов, если наш тип не удовлетворяет интерфейсу и/или не создан соответствующий адаптер. только статическая информация о типе стирается, ага Добавлено Цитата MyNameIsIgor @ korvin, давайте я попробую переписать код так давай ты просто напишешь реализацию класса |
|
Сообщ.
#5424
,
|
|
|
|
Цитата korvin @ о чем нам сообщит компилятор, и мы определим инстанс для любого типа, любого класса типов. В случае интерфейсов нам так же сообщит компилятор, а о чем не сможет - сообщит рантайм система языка. Цитата Цитата D_KEY @ точно также, как в случае утиных интерфейсов, если наш тип не удовлетворяет интерфейсу и/или не создан соответствующий адаптер. только статическая информация о типе стирается, ага Так никто же не говорит о замене |
|
Сообщ.
#5425
,
|
|
|
|
Цитата D_KEY @ А чем тебя не устроит кинутое исключение в операторе + конкретного типа при обнаружении, что аргумент метода имеет какой-то другой тип? Так ведут себя все динамические языки. тем, что это целиком зависит от автора типа левого аргумента (по которому идет диспетчеризация), тем что это вообще требуется. тем, что даже в статически-типизированных языках это придется делать в рантайме. Цитата D_KEY @ В данном случае - да. Но мне интересно, что ты собираешься делать, если тебе захочется динамического связывания и замены типов объектов в рантайме? Не придется ли писать все тоже самое для интерфейса, что ты уже написал для тайпкласса? в статически-типизированном языке с тайпклассами, параметрическим полиморфизмом и выводом типов? нет, не захочется. Добавлено Цитата D_KEY @ В случае интерфейсов нам так же сообщит компилятор, а о чем не сможет - сообщит рантайм система языка. ага, это весьма круто, ловить ошибки типизации в рантайме программы, написанной на статически-типизированном языке. |
|
Сообщ.
#5426
,
|
|
|
|
Цитата korvin @ в статически-типизированном языке с тайпклассами, параметрическим полиморфизмом и выводом типов? нет, не захочется. Почему? Как это помешает необходимости создания объекта нужного типа в рантайме и использованию его в соответствии с динамическим контрактом? Или же тебе придется делать гигантские алгебр. типы данных, перечисляя в них то, что при нормальном дизайне было бы отдельными типами... Добавлено Цитата korvin @ Цитата D_KEY @ В случае интерфейсов нам так же сообщит компилятор, а о чем не сможет - сообщит рантайм система языка. ага, это весьма круто, ловить ошибки типизации в рантайме программы, написанной на статически-типизированном языке. Если тебе не нужно это в динамике, делай все в статике, в чем проблема? Разве это повод запрещать такие механизмы? |
|
Сообщ.
#5427
,
|
|
|
|
Цитата D_KEY @ Почему? Как это помешает необходимости создания объекта нужного типа в рантайме и использованию его в соответствии с динамическим контрактом? Или же тебе придется делать гигантские алгебр. типы данных, перечисляя в них то, что при нормальном дизайне было бы отдельными типами... в хаскелле нет рантайма =) но ты можешь предложить конкретный пример своей волшебной ситуации и мы посмотрим, что тут может предложить хаскелл, мне пока таких ситуаций на ум не приходит =/ Добавлено Цитата D_KEY @ Если тебе не нужно это в динамике, делай все в статике, в чем проблема? Разве это повод запрещать такие механизмы? запрещать механизм, приводящий к потере информации о типе в статике?... да, это не повод, это причина Добавлено только не надо примеров вида "необходимо в зависимости от входных данных, вернуть объекты разных типов" =) это не задача, а способ решения =) |
|
Сообщ.
#5428
,
|
|
|
|
Цитата korvin @ только не надо примеров вида "необходимо в зависимости от входных данных, вернуть объекты разных типов" =) это не задача, а способ решения =) Хм. Если это способ решения, то какой задачи? И что тут предлагает Haskell? |
|
Сообщ.
#5429
,
|
|
|
|
Цитата D_KEY @ Хм. Если это способ решения, то какой задачи? И что тут предлагает Haskell? вот ты мне и скажи |
|
Сообщ.
#5430
,
|
|
|
|
Можешь для начала рассказать, как делается в Haskell сериализация и восстановление. А там посмотрим.
|