Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.192] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 370 371 [372] 373 374 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#5566
,
|
|
|
|
Цитата D_KEY @ Нет, ты всего-лишь описал некий контракт А специализация(инстанс) позволяет указать реализацию этого самого контракта. что нет? я сделал именно то, что написал. при чем тут контракт? |
|
Сообщ.
#5567
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ Нет, ты всего-лишь описал некий контракт А специализация(инстанс) позволяет указать реализацию этого самого контракта. что нет? я сделал именно то, что написал. при чем тут контракт? При том, что ты описал контракт, а не ассоциировал имя с различными определениями. "Различные определения" как раз будут указывать, как данный контракт реализовывается с помощью указанного типа. Добавлено korvin, вообще ты по-моему не желаешь понять то, что тебе говорят... Т.е. безконечно требуешь объяснений тому, что можно нагуглить и прочитать за пару минут. Неужели тебе не интересны схожие подходы в разных языках и ты отдаешь предпочтение шаблонным о них(языках) мнениям? Следует ли из твоих обвинений traits class и того, что ты не видешь концептуальной разницы между ними и type class, то, что ты так же негативно настроен против type class.Если не следует, то объясни, почему. |
|
Сообщ.
#5568
,
|
|
|
|
Цитата D_KEY @ При том, что ты описал контракт, а не ассоциировал имя с различными определениями. "Различные определения" как раз будут указывать, как данный контракт реализовывается с помощью указанного типа. т.е. по ссылке ты не сходил, определение перегрузки не понял? еще раз: есть четыре вида полиморфизма: универсальный: 1) параметрический 2) включение специальный: 3) приведение 4) перегрузка тайпклассы позволяют реализовать перегрузку: ![]() ![]() class CanBeInt a where toInt :: a -> Int data Eng = One | Two | Three data Rus = Odin | Dva | Tree instance CanBeInt Eng where -- перегрузка 1 для типа Eng toInt x = case x of One -> 1 Two -> 2 Three -> 3 instance CanBeInt Rus where -- перегрузка 2 для типа Rus toInt x = case x of Odin -> 1 Dva -> 2 Tree -> 3 -- да, в стандартном хаскелле можно перегружать только по одному типу. |
|
Сообщ.
#5569
,
|
|
|
|
Добавлено Цитата korvin @ тайпклассы позволяют реализовать перегрузку: ![]() ![]() class CanBeInt a where toInt :: a -> Int data Eng = One | Two | Three data Rus = Odin | Dva | Tree instance CanBeInt Eng where -- перегрузка 1 для типа Eng toInt x = case x of One -> 1 Two -> 2 Three -> 3 instance CanBeInt Rus where -- перегрузка 2 для типа Rus toInt x = case x of Odin -> 1 Dva -> 2 Tree -> 3 -- да, в стандартном хаскелле можно перегружать только по одному типу. А теперь попробуй сравнить вот это(аналог твоего кода в С++): ![]() ![]() template<typename T> class CanBeInt { int toInt(T data); }; enum Eng { One, Two, Three }; enum Rus { Odin, Dva, Tree }; template<> class CanBeInt<Eng> { // "перегрузка" 1 для типа Eng int toInt(Eng x) { switch(x) { case One: return 1; case Two: return 2; case Three: return 3; } } }; template<> class CanBeInt<Rus> { // "перегрузка" 2 для типа Rus int toInt(Rus x) { switch(x) { case Odin: return 1; case Dva: return 2; case Tree: return 3; } } }; С этим: ![]() ![]() enum Eng { One, Two, Three }; enum Rus { Odin, Dva, Tree }; int toInt(Eng); // перегрузка 1 для типа Eng int toInt(Rus); // перегрузка 2 для типа Rus Можно, конечно, и первый случай считать перегрузкой, но тут гораздо лучше подходит термин специализация. Впрочем, терминологические споры не очень мне интересны Добавлено Т.е. если ты декларируешь некий интерфейс, а потом создаешь его реализации, то тут мне кажется более уместным термин "специализация"(specialization) или (немного менее точно) инстанцирование(instantiation). Если есть несколько "независимых" объявлений с одним именем, то лучше подходит термин "перегрузка"(overloading). Кстати, в случае перегрузки сходства между перегруженными "объектами" ограничиваются лишь именем. Ну а в случае виртуальных функций лучше всего подходит "замещение"(overriding). Добавлено Хотя исключительно в контексте Haskell, термин "перегрузка", в принципе, подходит(ибо никакой другой перегрузки, кроме специализации тайпклассов нет). Но давай не будем исходить из особенностей конкретных языков. |
|
Сообщ.
#5570
,
|
|
|
|
Цитата D_KEY @ Можно, конечно, и первый случай считать перегрузкой, но тут гораздо лучше подходит термин специализация. Впрочем, терминологические споры не очень мне интересны ![]() в контексте рассуждения о шаблонах ты можешь хоть чем это называть. я говорю о полиморфизме Добавлено Цитата D_KEY @ Т.е. если ты декларируешь некий интерфейс, а потом создаешь его реализации, то тут мне кажется более уместным термин "специализация"(specialization) или (немного менее точно) инстанцирование(instantiation). Если есть несколько "независимых" объявлений с одним именем, то лучше подходит термин "перегрузка"(overloading). Кстати, в случае перегрузки сходства между перегруженными "объектами" ограничиваются лишь именем. ограничение по типу в Хаскелле связано с системой типов. наличие возможности использовать разное количество аргументов и вообще "связь только по имени" не является необходимым требованием. суть перегрузки не в этом. |
|
Сообщ.
#5571
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ Можно, конечно, и первый случай считать перегрузкой, но тут гораздо лучше подходит термин специализация. Впрочем, терминологические споры не очень мне интересны ![]() в контексте рассуждения о шаблонах ты можешь хоть чем это называть. я говорю о полиморфизме Причем тут шаблоны? Это ты почему-то применяешь специфическое для Haskell понимание overloading'а. Даже по твоей ссылке у overloading есть конкретное определение(которое ты сам и привел): Цитата Overloading is a syntactic abbreviation that associates one function name with a variety of function definitions. The same name can accepts a variety of unrelated sets of types as its arguments И я не вижу это в Haskell. А вижу я специализации тайпкласса для нужного типа. В чем я не прав? Да, это обеспечивает эмуляцию перегрузки и поскольку в Haskell по другому нельзя, то в контексте этого языка можно так называть, но если мы говорим в контексте языков разных, то это не перегрузка. Я всегда уточняю, если использую специфичную именно для С++ терминологию. Называй это "перегрузкой в стиле Haskell" |
|
Сообщ.
#5572
,
|
|
|
|
так что, предъявляя такое требование, ты "исходишь из особенностей конкретных языков".
|
|
Сообщ.
#5573
,
|
|
|
|
Цитата korvin @ ограничение по типу в Хаскелле связано с системой типов. Все замечательно. Для Haskell. Но не надо термины, верные в контексте одного языка, переносить в контекст межязыкового холивара Особенно, если холивар этого языка не касается |
|
Сообщ.
#5574
,
|
|
|
|
Цитата D_KEY @ Причем тут шаблоны? Это ты почему-то применяешь специфическое для Haskell понимание overloading'а. Даже по твоей ссылке у overloading есть конкретное определение(которое ты сам и привел): Цитата Overloading is a syntactic abbreviation that associates one function name with a variety of function definitions. The same name can accepts a variety of unrelated sets of types as its arguments И я не вижу это в Haskell. ![]() ![]() instance Foo Int where foo x = x instance Foo Double where foo x = x пожалуйста. функция foo определена на множестве несвязаных типов (Int * Double) |
|
Сообщ.
#5575
,
|
|
|
|
Цитата korvin @ так что, предъявляя такое требование, ты "исходишь из особенностей конкретных языков". Нет, я исхожу из приведенного же тобой определения Цитата Overloading is a syntactic abbreviation that associates one function name with a variety of function definitions. Почему ты считаешь, что тайпклассы, которые могут содержать несколько методов(а не один) и которые могут иметь специализации лишь по одному типу, подходят под это определение, для меня загадка. Да, в контексте Haskell, "перегрузка" именно так и делается(ибо иначе никак). Но это особенность конкретного языка. Добавлено korvin, давай забьем на термины, ты вроде хотел переписать код из статьи на яве(и мб на Haskell). |
|
Сообщ.
#5576
,
|
|
|
|
Цитата D_KEY @ korvin, давай забьем на термины, ты вроде хотел переписать код из статьи на яве(и мб на Haskell). нет, переписывать дословно я не хотел, решить задачу был бы непротив, но за всеми этими плюсовыми фишками я не вижу в чем заключается задача =/ ну допустим: ![]() ![]() -- так будут представлены значения, полученные из буфера: -- (можно было бы обойтись стандартным типом Maybe) data Value a = Val a | EOF deriving (Show, Read, Eq) -- класс для различных буферов: class StreamBuffer a where sgetc :: a b -> (Value b, a b) sgetn :: a b -> b -> Int -> Int -- хз, что эта функция должна делать ![]() ![]() -- наша кастомная реализация, например через списки: data Buffer a = Buffer [a] deriving (Show, Read, Eq) instance StreamBuffer Buffer where sgetc (Buffer [] ) = (EOF , Buffer []) sgetc (Buffer (x:xs)) = (Val x, Buffer xs) sgetn _ _ n = n |
|
Сообщ.
#5577
,
|
|
|
|
Т.е. будем делать полную реализацию для каждого типа? Великолепно
|
|
Сообщ.
#5578
,
|
|
|
|
полную реализацию чего?
|
|
Сообщ.
#5579
,
|
|
|
|
Цитата korvin @ полную реализацию чего? StreamBuffer'а И я не понимаю, как твой код решает проблему работы с разными символами и разными характеристиками. Ты опять же решаешь узкую конкретную проблему с EOF(или другими специальными символами). И то не полностью - приходится полностью специализировать StreamBuffer даже если изменился только EOF. Кстати, а если тебе понадобится дополнительно функция сравнения символов? Добавлено korvin, может на яве тоже? Все-таки к теме ближе |
|
Сообщ.
#5580
,
|
|
|
|
Цитата D_KEY @ StreamBuffer'а И я не понимаю, как твой код решает проблему работы с разными символами и разными характеристиками. Ты опять же решаешь узкую конкретную проблему с EOF(или другими специальными символами). а зачем ему это решать? в чем проблема-то заключается? в какой из функций буффера (sgetc, sgetn)? Цитата D_KEY @ И то не полностью - приходится полностью специализировать StreamBuffer даже если изменился только EOF. в каком месте он изменится? он константа типа (Value a). Цитата D_KEY @ Кстати, а если тебе понадобится дополнительно функция сравнения символов? где и зачем? Добавлено Цитата D_KEY @ korvin, может на яве тоже? Все-таки к теме ближе ![]() рано, я еще не вижу проблему ![]() ![]() public interface StreamBuffer<A> { public static final Object EOF = null; public A get(); public int get(A c, int n); } |