Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.119.105.239] |
|
Страницы: (33) « Первая ... 12 13 [14] 15 16 ... 32 33 ( Перейти к последнему сообщению ) |
Сообщ.
#196
,
|
|
|
Цитата korvin @ Я нигде и никогда не встречал такого странного понимания ПП (ну разве только что того Хаскелиста с ЛОРа). Кто-нибудь кроме тебя еще считает, что ПП это прерогатива языков исключительно со статической типизацией? Или это твоя личная интерпретация понятия ПП? уверен на 100%. Параметрический полиморфизм(ПП) параметризуется типами, что совершенно бессмысленно при динамической типизации, т.к. там в любом случае типы приходится выяснять в рантайме и то только если нужно. Фактически ПП нужен для "обхода" ограничений примитивной статической типизации и написания обощённого кода. Цитата korvin @ Попробуй написать функцию len, вычисляющую длину списка в Лиспе(да вообще в любом ЯП с дин. типизацией) и в D (вообще в любом ЯП со статической типизацией) и в (оригинальном)Паскале, например. Цитата MyNameIsIgor @ Не улавливаю хода вашей мысли. Поподробней пожалуйста.function f(a, b) { return a+b; } будет работать для кучи типов. В языках со статической типизацией возникнут проблемы. auto foo(A, B)(A a, B b) { return a + b; } Цитата D_KEY @ Ну, эту разнице объяснять не нужно, она понятна. Я просто не согласен, что она является определяющей для понятия ПП. Korvin похоже считает иначе.Я пытался объяснить разницу между параметрическим полиморфизмом уровня системы типов и параметрическим полиморфизмом на уровне кода(что мы наблюдаем в C++ и D). Цитата D_KEY @ Если бы там был такой вывод, то не было и того холивара. Там делается другой вывод: C++ - говно, C# и Java тоже говно, но менее вонючее, а Хаскель - няшка. Но вывод там в том, что на C++ такую проверку сделать нельзя. И ведь действительно нельзя. |
Сообщ.
#197
,
|
|
|
Цитата applegame @ Кто-нибудь кроме тебя еще считает, что ПП это прерогатива языков исключительно со статической типизацией? Я считаю, что в языках с динамической типизацией параметрический полиморфизм бессмысленнен. Зачем он там нужен-то? Можешь пример привести? |
Сообщ.
#198
,
|
|
|
Цитата D_KEY @ Что значит бессмысленнен? Он там просто есть. Методы в Ruby всегда полиморфны по всем параметрам. И в жабаскрипте тоже. Еще раз читаем определение ПП, вдумчиво пожалуйста и ищем там хоть какое-то упоминание динамической/статической типизации, run-time или compile-time:Я считаю, что в языках с динамической типизацией параметрический полиморфизм бессмысленнен. Зачем он там нужен-то? Можешь пример привести? Цитата Педивикия Параметрический полиморфизм позволяет определять функцию или тип данных обобщённо, так что значения обрабатываются идентично вне зависимости от их типа. Параметрически полиморфная функция использует аргументы на основе поведения, а не значения, апеллируя лишь к необходимым ей свойствам аргументов, что делает её применимой в любом контексте, где тип объекта удовлетворяет заданным требованиям поведения. Таким образом, реализуется концепция параметричности |
Сообщ.
#199
,
|
|
|
Цитата applegame @ Цитата korvin @ Попробуй написать функцию len, вычисляющую длину списка в Лиспе(да вообще в любом ЯП с дин. типизацией) и в D (вообще в любом ЯП со статической типизацией) и в (оригинальном)Паскале, например. Цитата MyNameIsIgor @ Не улавливаю хода вашей мысли. Поподробней пожалуйста.function f(a, b) { return a+b; } будет работать для кучи типов. В языках со статической типизацией возникнут проблемы. auto foo(A, B)(A a, B b) { return a + b; } Ты использовал шаблон, который потом позволит генерировать код для нужных типов. В некоторых других языках со статической типизацией ты бы использовал дженерик-функцию с ограничением(для вызова +) или полиморфную функцию, принимающую аргумент типа, который удовлетворяет некоторому тайпклассу(опять же, для +), в некоторых - написал бы макрос или воспользовался внешним генератором кода. В языках с динамической типизацией в этом нет никакой необходимости, так как код изначально принимает объекты, которые могут иметь совершенно любые типы, в том числе несовместимые для бинарной операции или вообще не поддерживающие данную операцию. И определяется это все только во время выполнения. |
Сообщ.
#200
,
|
|
|
Цитата D_KEY @ И чем это хорошо?которые могут иметь совершенно любые типы, в том числе несовместимые для бинарной операции или вообще не поддерживающие данную операцию. И определяется это все только во время выполнения. Цитата D_KEY @ Вариант на расте:В некоторых других языках со статической типизацией ты бы использовал дженерик-функцию с ограничением(для вызова +) fn f<T1, T2, R>(a: T1, b: T2) -> R where T1: std::ops::Add<T2, Output = R> { a + b } А разве не убрали совсем? Цитата Qraizer @ В расте, в данный момент, вообще нет специализации. И даже не полностью инстанцироаться при конкретизации. (А вот дженерики последнее могут?) |
Сообщ.
#201
,
|
|
|
Цитата D_KEY @ Именно так. И именно поэтому все функции в динамически типизированных языках всегда параметрически полиморфны. А в C++/D/Rust/Java/C# и т.п. для таких функций создан специальный синтаксис. В языках с динамической типизацией в этом нет никакой необходимости, так как код изначально принимает объекты, которые могут иметь совершенно любые типы, в том числе несовместимые для бинарной операции или вообще не поддерживающие данную операцию. И определяется это все только во время выполнения. |
Сообщ.
#202
,
|
|
|
Цитата DarkEld3r @ И чем это хорошо? Некоторым нравится. Я сторонник статической типизации. Добавлено Цитата applegame @ Именно так. И именно поэтому все функции в динамически типизированных языках всегда параметрически полиморфны. Ты, конечно, можешь так считать. Но это довольно бессмысленное утверждение. Цитата wiki Parametric polymorphism - In programming languages and type theory, parametric polymorphism is a way to make a language more expressive, while still maintaining full static type-safety. Using parametric polymorphism, a function or a data type can be written generically so that it can handle values identically without depending on their type.[1] Such functions and data types are called generic functions and generic datatypes respectively and form the basis of generic programming. Добавлено Цитата applegame @ Ну, эту разнице объяснять не нужно, она понятна. Я просто не согласен, что она является определяющей для понятия ПП. Потому, что у нас есть генерация кода. У нас нет типов/функций, которые бы парметризировались типами и не зависели бы при этом от них. У нас есть механизм генерации типов/функций на основе других типов(и/или некоторых значений), который генерирует разный код в зависимости от них(ибо у нас есть перегрузка функций и специализация шаблонов, а это уже уход от параметрического полиморфизма). Цитата Цитата D_KEY @ Если бы там был такой вывод, то не было и того холивара. Там делается другой вывод: C++ - говно, C# и Java тоже говно, но менее вонючее, а Хаскель - няшка.Но вывод там в том, что на C++ такую проверку сделать нельзя. И ведь действительно нельзя. Ну такого я там не нашел. По сути своим примером он показал, что в C++ есть генерация кода, но нет параметрического полиморфизма. |
Сообщ.
#203
,
|
|
|
Цитата D_KEY @ Все ясно. Я понимаю ПП в более широком смысле, чем ты и korvin. Спор опять ведется вокруг терминов, которые четко нигде не определены. В любом случае, думаю, я понял ваше понимание ПП. Я с ним не согласен, но спор тут точно ничего не решит. Ты, конечно, можешь так считать. Но это довольно бессмысленное утверждение. Добавлено Цитата D_KEY @ Нет, он показал, что шаблоны не справляются с некоторыми задачами, с которыми могут справится языки с более продвинутой системой типов, а не то что в C++ нет ПП. Попросту говоря сделал вывод, который не следует из показанного. А так как он это явно сделал намеренно, то можно просто сказать - солгал. Ну такого я там не нашел. По сути своим примером он показал, что в C++ есть генерация кода, но нет параметрического полиморфизма. |
Сообщ.
#204
,
|
|
|
Цитата applegame @ Нет, он показал, что шаблоны не справляются с некоторыми задачами, с которыми могут справится языки с более продвинутой системой типов, а не то что в C++ нет ПП. Цитата Some implementations of type polymorphism are superficially similar to parametric polymorphism while also introducing ad hoc aspects. One example is C++ template specialization. |
Сообщ.
#205
,
|
|
|
Цитата D_KEY @ Причем тут специализация шаблонов? Да, специализация шаблонов - это явно не ПП, это явный ad-hoc полиморфизм. Но мы то не его обсуждаем. Some implementations of type polymorphism are superficially similar to parametric polymorphism while also introducing ad hoc aspects. One example is C++ template specialization. |
Сообщ.
#206
,
|
|
|
Цитата applegame @ Цитата D_KEY @ Причем тут специализация шаблонов? Да, специализация шаблонов - это явно не ПП, это явный ad-hoc полиморфизм. Но мы то не его обсуждаем.Some implementations of type polymorphism are superficially similar to parametric polymorphism while also introducing ad hoc aspects. One example is C++ template specialization. Мы обсуждаем, являются ли шаблоны параметрическим полиморфизмом. Это парметрический полиморфизм? template<typename T> void foo(T a) { bar(a); } А если добавить: template<> void foo<int>(int x) { } ? Параметрический полиморфизм вдруг испариться? Так может его и не было? |
Сообщ.
#207
,
|
|
|
Цитата D_KEY @ Ты же уже признал, что является Мы обсуждаем, являются ли шаблоны параметрическим полиморфизмом. Цитата D_KEY @ Да, испарится. Перегрузка функций и специализация - ad-hoc полиморфизм. Параметрический полиморфизм вдруг испариться? Так может его и не было? |
Сообщ.
#208
,
|
|
|
Цитата applegame @ Цитата D_KEY @ Ты же уже признал, что является Мы обсуждаем, являются ли шаблоны параметрическим полиморфизмом. Ну там был другой контекст, для которого нюансы были неважны. Цитата Цитата D_KEY @ Да, испарится. Перегрузка функций и специализация - ad-hoc полиморфизм.Параметрический полиморфизм вдруг испариться? Так может его и не было? Так получается, что вот тут: template<typename T> void foo(T a) { bar(a); } мы не можем сказать, есть ли тут параметрический полиморфизм. Ведь мы не знаем, будет ли специализация. Более того, мы не знаем, что за bar у нас тут Тут же будет учтена перегрузка, так? А ведь это не параметрический полиморфизм. |
Сообщ.
#209
,
|
|
|
Цитата D_KEY @ Все зависит от того как эта функция будет определена в точке вызова/инстанцирования шаблона.мы не можем сказать, есть ли тут параметрический полиморфизм. bar тут совсем не причем. Полиморфность функции bar никак не влияет на полиморфность foo. |
Сообщ.
#210
,
|
|
|
Цитата applegame @ Не улавливаю хода вашей мысли. Поподробней пожалуйста. Нет никакого смысла рассуждать о параметрическом полиморфизме при динамической типизации. Собственно параметрический полиморфизм и был описан именно для статической типизации. Для динамических языков об этом просто никто не задумывался - это бессмысленно. |