Здравствуйте, beroal, Вы писали:
B>На самом деле вы оба правы. Статический/динамический относится к компиляции, следовательно, это варианты реализации полиморфизма. Потому что логика программы от этого не меняется. А ad-hoc и параметрический различаются по логике. Т.е. есть два варианта классификации полиморфизма (по логике и по реализации). Их действительно часто путают.
Собственно я говорил именно о "статический/динамический" и "ad-hoc и параметрический" не приплетал.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Мне нужна нибкость при создание ГУИ. Чем тут мне поможет Лисп? Убогими библиотеками наспех прицепленными к его скобочкам? Да ни в жизни. А вот XAML решает пробелму на ура. Причем в нем даже есть некие функциональные черты. Хотя это скрее язык разметки.
Кстати, лисп в чистом виде. Только вместо кучи нормальных скобочек, которые тебе не нравятся, есть куча не нормальных,
которые тебе нравятся. Парадокс.
Здравствуйте, beroal, Вы писали:
B>Здравствуйте, Gaperton, Вы писали:
G>>1) Существует два способа. Первый — параметрические типы (аналог шаблонов), и второй — АДТ (абстрактные типы данных, ближе всего к интерфейсам). Вроде как все знакомо. G>>2) А вот здесь начинается самое интересное. Во-первых, для каждого типа (класса), соответствующего АДТ (реализующего интерфейс) надо явно указать набор функций, которые реализуют АДТ. Функции могут быть совершенно произвольными, в частности две разных реализации АДТ могут вообще говоря иметь пересекающийся набор функций. Что прикольно. B>Категорически не согласен. Значит, метод write может выполнять чтение?
Нет, не значит. "могут вообще говоря" означает, что в общем случае, они не обязаны быть разными. И ничего кроме. B>То есть сделать так можно, но не нужно.
А теперь насчет того, когда это нужно, а когда нет. Во первых, это позволяет просимулировать наследование реализации. Во вторых, есть ситуации, когда это просто спасает. Пример — есть много классов, с примерно одинаковыми данными, но немного разным прикладным смыслом. Классы состоят друг с другом в сложных отношениях. В этом случае так делать нужно.
Здравствуйте, VladD2, Вы писали:
VD>А, ну, то есть я не понял. Так что же ты вместо того чтобы сказать, что я тебя не понял, и ты говоришь про патерн-матчинг, начал доказывать, что мултиметода — это норенная особенность ФЯ?
На всякий случай, когда тебе кажется, что кто-то написал глупость, вместо этого считай, что ты человека не понял. Неплохой индикатор непонимания, сильно не ошибешься. Не придется разводить флейм, упираться, и пытаться потом сохранить лицо. Потому как убедить тебя, что ты не понял, как показывает опыт, практически невозможно. Это первый на моей памяти случай.
VD>А у меня к тебе пробсьба общественно характера. Смени стиль общения. Прекрати постоянно пытаться задевать других людей.
Я постоянно это делать и не пытаюсь. Так скажем, я вообще не пытаюсь задевать других людей. Я реагирую на их посты. В чем может убедится каждый, посмотрев историю моих постов. И в чем ты можешь убедиться лично, выполнив мою просьбу и последовав предыдущему совету. Если тебя это сильно не затруднит, конечно.
VD>ЗЫ VD>В общем, редлагаю не разводить здесь флэйм.
Нивапрос.
Здравствуйте, Gaperton, Вы писали:
G>На всякий случай, когда тебе кажется, что кто-то написал глупость, вместо этого считай, что ты человека не понял. Неплохой индикатор непонимания, сильно не ошибешься. Не придется разводить флейм, упираться, и пытаться потом сохранить лицо. Потому как убедить тебя, что ты не понял, как показывает опыт, практически невозможно. Это первый на моей памяти случай.
Тут оно как, всегда кто-то кого-то может непонять. И всегда это можно объяснить. А вот если в отвоет, начинать доказвать что-то другое, то конечно получается фигня.
Вот в данном случае ты как раз начал вещать о мултиметодах и довещался до полной ерунды. А из твоего исходного высказывания совсем не очевидно, что ты имел в виду не полиморфизм, а патрн-матчинг. Особненно это не очевидно в контексте данной темы. Ведь патерн-матчинг к полиморфизкму отношения не имеет. Это сдедство управления ветвлением вроде if/switch.
VD>>А у меня к тебе пробсьба общественно характера. Смени стиль общения. Прекрати постоянно пытаться задевать других людей. G>Я постоянно это делать и не пытаюсь. Так скажем, я вообще не пытаюсь задевать других людей.
Судя по результатам у тебя это плохо получается.
G> Я реагирую на их посты. В чем может убедится каждый, посмотрев историю моих постов. И в чем ты можешь убедиться лично, выполнив мою просьбу и последовав предыдущему совету. Если тебя это сильно не затруднит, конечно.
Каждый и убеждается. И поверь убеждается именно в том, о чем я тебе говорю. А свои просбы тебе бы в первую очередь самому бы выполнять. Глядишь проблем было бы меньше.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Вот в данном случае ты как раз начал вещать о мултиметодах и довещался до полной ерунды.
Не хами, модератор. Я уже устал учить тебя вежливости, но видимо придется опять — раз в семье не научили.
VD>А из твоего исходного высказывания совсем не очевидно, что ты имел в виду не полиморфизм, а патрн-матчинг. Особненно это не очевидно в контексте данной темы. Ведь патерн-матчинг к полиморфизкму отношения не имеет. Это сдедство управления ветвлением вроде if/switch.
Перечитай мой изначальный пост от начала до конца, внимательно. Посмотри примеры, которые я привел. Я не могу делать расшифровки каждого абзаца, подобные предыдущей, поэтому придется подумать самому, если конечно у тебя есть желание понять. В чем я лично сильно сомневаюсь. Потому, как ты опять не понимаешь. И самое смешное, еще пытаешься меня учить, что такое паттерн-матчинг . Смени, вобщем, стиль общения, утомляет.
Здравствуйте, Gaperton, Вы писали:
VD>>Вот в данном случае ты как раз начал вещать о мултиметодах и довещался до полной ерунды. G>Не хами, модератор. Я уже устал учить тебя вежливости, но видимо придется опять — раз в семье не научили.
Хамиш в данном случае ты. Причем с переходом на личности.
G>Перечитай мой изначальный пост от начала до конца, внимательно. Посмотри примеры, которые я привел.
Почитал очень внимательно. Понял, что ты, по-моему, в принципе не верно понимаешь термин полиморфизм. Патерн-матчинг ты принимаешь за полиморфизм. Именно по этому я тебя и не понял. Собственно вот определение из которого я исхожу http://en.wikipedia.org/wiki/Polymorphism_%28computer_science%29#Ad-hoc_polymorphism
G>Я не могу делать расшифровки каждого абзаца, подобные предыдущей, поэтому придется подумать самому, если конечно у тебя есть желание понять. В чем я лично сильно сомневаюсь. Потому, как ты опять не понимаешь.
Что же... если тебя постоянно не понимаю, то возможно ты просто плохо объясняшь? Ну, или ошибашся? В общем, это не повод для перехода на личности.
G>И самое смешное, еще пытаешься меня учить, что такое паттерн-матчинг .
Похоже что ты не верно понимаешь значения слова полиморфизм. Но боюсь вместо обсуждения этого в получить новую порцию оскарблений.
G>Смени, вобщем, стиль общения, утомляет.
Прекращай хамить и переходить на личность собеседника. Это форум не для нездов и разборок.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
G>>Перечитай мой изначальный пост от начала до конца, внимательно. Посмотри примеры, которые я привел. VD>Почитал очень внимательно. Понял, что ты, по-моему, в принципе не верно понимаешь термин полиморфизм.
Плохо. Перечитай еще раз .
VD>Патерн-матчинг ты принимаешь за полиморфизм. Именно по этому я тебя и не понял.
Не думаю. Советую рассмотреть вариант, что ты принимаешь паттерн-матчинг за аналог операции ветвления в ИЯ. Вот поэтому ты меня не понял.
VD>Собственно вот определение из которого я исхожу http://en.wikipedia.org/wiki/Polymorphism_%28computer_science%29#Ad-hoc_polymorphism
Ну наконец-то, конструктивный разговор. Я исхожу из такого же определения. Прикольно, правда? А паттерн-матчинг я за полиморфизм не принимаю, это разные вещи. Применение паттерн-матчинга при задании аргументов функции — вот это является одним из самых мощных способов достижения полиморфизма в ФЯ.
Все эти определения могут быть даны одновременно, и в рантайме будет выбрано наиболее специфичное.
poly_function( { A, B } ) -> ...;
вызовется, если аргумент — структура из двух элементов.
poly_function( [ A, B ] ) -> ...;
вызовется, если аргумент — список из двух элементов. Разные типы, все в порядке, так?
poly_function( { A, { B, C } } ) -> ...;
вызовется, если аргумент — структура из двух элементов, а значение второго элемента — тоже структура из двух элементов. Что можно также понимать, как единое определение типа (такая хитрая структура) — пока все честно, не так ли?
Как видишь, мы уточнили ограничение на тип по сравнению с первой строкой. Теперь оно более специфично.
Паттерн матчинг, однако. И речь идет одновременно и о типах и о значениях. Теперь нам ничего не мешает поступить так:
poly_function( { A, { value_5, C } ) where A < C -> ...;
Почти тоже самое, но мы еще более сузили множество значений, при котором вызовется эта функция. Тип данных в частности однозначно определяется множеством значений этого типа, так что аргумент-паттерн можно также понимать как способ конструирования подтипов без их явного определения (!). С такой точки зрения мы не выходим за рамки классического определения полиморфизма. Если ты еще не понял, о чем я, то заметь, что на С++ я каждый вариант могу завернуть в свой подкласс, и написать совершенно такой же код, где poly_function будет являтся виртуальной функцией каждого подкласса. В ФЯ же я этого делать не обязан.
По сути дела, применяя паттерн-матчинг для спецификации аргументов, мы не просто задаем тип, как по классике. Мы накладываем ограничение на тип и значение аргумента, что позволяет нам произвольно варьировать подмножество объектов, на котором должна сработать выбранная функция. Это и обеспечивает нам более гибкий полиморфизм — то, что вместо простой спецификации типа аргумента мы в состоянии наложить на аргумент и его тип почти произвольное ограничение.
С некоторой точки зрения на полиморфизм и природу типов (такой как у тебя, например), подобное поведение выходит за рамки понятия "полиморфизм". С моей — нет. Здесь разница в слишком глубоких посылках, и философском подходе, чтобы так легко говорить, что кто-то "неверно понимает полиморфизм". Я бы выразился, что с моей точки зрения, ты понимаешь его узко — а именно в соответствии с его реализацией в распространенных ОО языках. Ну а свой взгляд на это явление, а также объяснение, почему это на мой взгляд не противоречит известному определению полиморфизма, я привел. Если непонятно, давай пообсуждаем.
G>>И самое смешное, еще пытаешься меня учить, что такое паттерн-матчинг . VD>Похоже что ты не верно понимаешь значения слова полиморфизм. Но боюсь вместо обсуждения этого в получить новую порцию оскарблений.
Правильно боишься. Вежливый человек на твоем месте сказал бы "похоже, мы с тобой по разному понимаем значение слова полиморфизм". Вот в такой формулировке — да, есть что пообсуждать. А в твоей — обсуждать с тобой то, что я "не верно понимаю", мне не хочется. Потому как самый адекватный ответ на такую фразу — "сам дурак" . Но мы ведь вежливые люди, и не хотим разводить здесь флейм, не так ли? Поэтому я промолчу
Здравствуйте, Gaperton, Вы писали: G>Ну наконец-то, конструктивный разговор. Я исхожу из такого же определения. Прикольно, правда? А паттерн-матчинг я за полиморфизм не принимаю, это разные вещи. Применение паттерн-матчинга при задании аргументов функции — вот это является одним из самых мощных способов достижения полиморфизма в ФЯ.
Ну, вообще-то определение полиморфизма в википедии все-таки работает с типами, а не со значениями. Таким образом, паттерн-матчинг является более мощной концепцией, чем ad-hoc полиморфизм, описанный в wiki. Во-первых, он сохраняет некоторые черты параметрического полиморфизма, в том смысле, что множество типов, с которыми может работать конкретная версия функции, не является конечным. Во-вторых, все-таки паттерн может использовать больше информации об аргументе, чем просто тип.
С абстрактно-философской точки зрения, тем не менее, я считаю трактовку паттерн-матчинга как средства достижения полиморфизма вполне корректной. Да, ты абсолютно прав: мы можем а) предоставить функцию для работы с аргументами независимо от их типа и б) автоматически выбирать реализацию функции в зависимости от ее аргументов.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Gaperton, Вы писали: G>>Ну наконец-то, конструктивный разговор. Я исхожу из такого же определения. Прикольно, правда? А паттерн-матчинг я за полиморфизм не принимаю, это разные вещи. Применение паттерн-матчинга при задании аргументов функции — вот это является одним из самых мощных способов достижения полиморфизма в ФЯ.
S>Ну, вообще-то определение полиморфизма в википедии все-таки работает с типами, а не со значениями. Таким образом, паттерн-матчинг является более мощной концепцией, чем ad-hoc полиморфизм, описанный в wiki. Во-первых, он сохраняет некоторые черты параметрического полиморфизма, в том смысле, что множество типов, с которыми может работать конкретная версия функции, не является конечным. Во-вторых, все-таки паттерн может использовать больше информации об аргументе, чем просто тип.
S>С абстрактно-философской точки зрения, тем не менее, я считаю трактовку паттерн-матчинга как средства достижения полиморфизма вполне корректной. Да, ты абсолютно прав: мы можем а) предоставить функцию для работы с аргументами независимо от их типа и б) автоматически выбирать реализацию функции в зависимости от ее аргументов.
Можно рассматривать не только с абстрактно-философской точки зрения. В системе типов Хиндли-Милнера тип — это множество значений. Таким образом, значение тоже является типом.
Здравствуйте, Sinclair, Вы писали:
S>Ну, вообще-то определение полиморфизма в википедии все-таки работает с типами, а не со значениями. Таким образом, паттерн-матчинг является более мощной концепцией, чем ad-hoc полиморфизм, описанный в wiki. Во-первых, он сохраняет некоторые черты параметрического полиморфизма, в том смысле, что множество типов, с которыми может работать конкретная версия функции, не является конечным. Во-вторых, все-таки паттерн может использовать больше информации об аргументе, чем просто тип.
И это тоже зависит от точки зрения. G>> Тип данных в частности однозначно определяется множеством значений этого типа, так что аргумент-паттерн можно также понимать как способ конструирования подтипов без их явного определения (!). С такой точки зрения мы не выходим за рамки классического определения полиморфизма.
S>С абстрактно-философской точки зрения, тем не менее, я считаю трактовку паттерн-матчинга как средства достижения полиморфизма вполне корректной.
Не такая уж она (точка зрения) абстрактно-философская. Паттерн-матчинг часто на практике применяется там, где в С++ пользуются виртуальными функциями. Перейдем от абстрактных рассуждений к конкретным примерам.
Рассмотрим задачу обхода бинарного дерева. Пусть у нас есть бинарное дерево с числами в узлах, и нам необходимо выполнить его обход чтобы посчитать сумму. На С++ получится примерно два-три класса c виртуальным методом Sum, если мы конечно захотим воспользоваться "родным" для С++ полиморфизмом для определения различия между листом и обычным узлом. Т. е. чтобы воспользоваться встроенным в язык run-time полиморфизмом, нам надо явно определить новый класс (тип) на каждое определение функции. Плюс, определение полиморфной функции получится обязательно привязано к определению типа — это не нравится многим функциональщикам, например Joe Armstrong-у. Я, впрочем, к этому отношусь спокойно, возможно потому, что С++ мой основной язык.
// без деструкторов и конструкторов, бо ни к чему это в примере...class Leaf
{
protected:
int m_number;
public:
virtual int Sum() const { return m_number; }
};
class NonLeaf : public Leaf
{
TreeNode *m_pLeft, *m_pRight;
public:
int Sum() const { return m_number + m_pLeft -> Process() + m_pRight -> Process(); }
};
А на ФЯ мы для решения абсолютно той же задачи (разная функция обработки для узлов разных типов) применим pattern-matching:
sum( { Left, Right, Num } ) -> Num + process( Left ) + process( Right );
sum( Num ) -> Num.
Как видишь, код соответствует практически один в один. Подобное применение паттерн-матчинга — повседневная практика для программиста на ФЯ, а не абстрактная философия.
Кстати, опять, решение "в лоб" на ФЯ является самым "правильным". Это возвращаясь к разговору о "невидимости паттернов".
Здравствуйте, Gaperton, Вы писали:
G>Кстати, опять, решение "в лоб" на ФЯ является самым "правильным". Это возвращаясь к разговору о "невидимости паттернов".
А вот тут можно чуть подробнее?
Уже не 1-й раз встречаю об этом, но всё "всколзь". Хотелось бы чего-нибудь почитать на сию тему. Или м.б. уже на рсдн осбуждали, но меня рядом не оказалось?
Заявление: G>А паттерн-матчинг я за полиморфизм не принимаю, это разные вещи.
Слабо сочетается с: G> Применение паттерн-матчинга при задании аргументов функции — вот это является одним из самых мощных способов достижения полиморфизма в ФЯ.
Паттерн-матчинг вообще не имеет отношения к полиморфизму. Прочитай еще раз определение из Википедии. Там четко говорится о типах.
G>Все эти определения могут быть даны одновременно, и в рантайме будет выбрано наиболее специфичное. G>poly_function( { A, B } ) -> ...; G>вызовется, если аргумент — структура из двух элементов.
G>poly_function( [ A, B ] ) -> ...; G>вызовется, если аргумент — список из двух элементов. Разные типы, все в порядке, так?
Так. Но это перегрузка функций, а не паттерн-матчинг. Перегрузка — это несомненно статический полиморфизм.
G>poly_function( { A, { B, C } } ) -> ...; G>вызовется, если аргумент — структура из двух элементов, а значение второго элемента — тоже структура из двух элементов. Что можно также понимать, как единое определение типа (такая хитрая структура) — пока все честно, не так ли?
Не так, Ли. Это всего лишь иная запись для if-а из ИЯ.
G>Как видишь, мы уточнили ограничение на тип по сравнению с первой строкой. Теперь оно более специфично.
Не вижу. Вижу подмену понятий.
G>Паттерн матчинг, однако. И речь идет одновременно и о типах и о значениях.
Каша, однако.
G>С некоторой точки зрения на полиморфизм и природу типов (такой как у тебя, например), подобное поведение выходит за рамки понятия "полиморфизм".
Эта точка зрения называется классической. И ее придерживаются все толковые словари. Полиморфизм работат на уровне типов. Точка! Все что не связано с типами к полиморфизму не относится.
G> С моей — нет. Здесь разница в слишком глубоких посылках, и философском подходе, чтобы так легко говорить, что кто-то "неверно понимает полиморфизм".
Эдак любой термин можно переиначит на наезжать на других, что тебя не понимают. Термины для того и определяются, чтобы люди друг-друга понимали.
G> Я бы выразился, что с моей точки зрения, ты понимаешь его узко — а именно в соответствии с его реализацией в распространенных ОО языках. Ну а свой взгляд на это явление, а также объяснение, почему это на мой взгляд не противоречит известному определению полиморфизма, я привел. Если непонятно, давай пообсуждаем.
Твое обоснование, лично для меня, выглядит не убедительно.
G>Правильно боишься. Вежливый человек на твоем месте сказал бы "похоже, мы с тобой по разному понимаем значение слова полиморфизм".
Косвенное наклеивание на собеседника ярлыка, например, не вежливого человека является довольно низкопроблым демагогическим приемом. Лично я не считаю, что мое мнение о твоей не правоте является не вижливым или оскорбительным. Более того, после подобных выпадов я только больше укрепляюсь в этом мнении.
G> Вот в такой формулировке — да, есть что пообсуждать. А в твоей — обсуждать с тобой то, что я "не верно понимаю", мне не хочется.
То есть обсуждать ты хочешь только если за тобой признают абсолютную правоту?
G> Потому как самый адекватный ответ на такую фразу — "сам дурак" .
Для снесения в помойку, да.
G> Но мы ведь вежливые люди, и не хотим разводить здесь флейм, не так ли? Поэтому я промолчу
Что-то ты слишком громко молчишь. И все не по теме.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Sinclair, Вы писали:
S>С абстрактно-философской точки зрения, тем не менее, я считаю трактовку паттерн-матчинга как средства достижения полиморфизма вполне корректной. Да, ты абсолютно прав: мы можем а) предоставить функцию для работы с аргументами независимо от их типа и б) автоматически выбирать реализацию функции в зависимости от ее аргументов.
Тогда банальный if — это тоже полиморфизм.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Вот аналог твоей процедуры без наследования полипорфизма и т.п.
class NonLeaf : public Leaf
{
TreeNode *m_pLeft;
TreeNode *m_pRight;
int m_number;
public:
int Sum() const
{
return
(m_pLeft == NULL ? 0 : m_pLeft->Sum())
+ (m_pRight == NULL ? 0 : m_pRight->Sum())
+ m_number;
};
Еще раз повторюсь. Если имеет место рантайм-анализ значений, то это не полиморфизм. Если имеет место подбор функции по типу, то это полиморфизм. Но подбор функции по типу — это перегрузка или виртуальный вызов, а не как не паттерн-мачинг.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Nick_, Вы писали:
N_>Можно рассматривать не только с абстрактно-философской точки зрения. В системе типов Хиндли-Милнера тип — это множество значений. Таким образом, значение тоже является типом.
Ну, тогда любой код полиморфный. Ведь все значения отдельные типы. По-моему — это уже абсурд.
Все таки есть общепринятое (классическое) понятие типа. И общепринятое понятие полипорфизма. И в разговоре с другими (особенно не обращенными в некую религию) нужно придерживаться общепринятых понятий.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Nick_, Вы писали:
N_>>Можно рассматривать не только с абстрактно-философской точки зрения. В системе типов Хиндли-Милнера тип — это множество значений. Таким образом, значение тоже является типом.
VD>Ну, тогда любой код полиморфный. Ведь все значения отдельные типы. По-моему — это уже абсурд.
VD>Все таки есть общепринятое (классическое) понятие типа. И общепринятое понятие полипорфизма. И в разговоре с другими (особенно не обращенными в некую религию) нужно придерживаться общепринятых понятий.