Сообщение Re[19]: IEquatable<T> от 20.02.2017 17:52
Изменено 20.02.2017 17:53 vdimas
S>Итак, предположим что это работало бы в дотнете.
Если язык позиционирует себя как статически-типизируемый, то обязано было бы.
V>>Если сделать как показал выше, то получим ошибку:
V>>
S>Так убери конкурирующую специализацию или переобзови ее другим именем.V>>error CS0111: Type 'MyExtentions1' already defines a member called 'IndexOf' with the same parameter types
Напротив, я записал её абсолютно верно, т.е. именно так, как требуется писать в статически-типизируемом языке, поддерживающем (якобы поддерживающем) параметрический полиморфизм.
S>Получишь 2 метода, у которых ad-hoc полиморфизм, но хоть они будут компилироваться и работать.
А мне надо не два, а один перегруженный метод.
V>>Если разнести эти определения по разным MyExtentions1 и MyExtentions2 и потом попытаться использовать ad-hoc полиморфизм на IndexOf:
S>Ты не можешь его попытаться использовать.
Верно не могу.
Именно это и порицается.
Потому что в Хаскеле и в С++ — могу.
S>Ты можешь его попытаться не использовать, но от ad-hoc ты никак не отделаешься.
Да не пытаюсь я отделаться от ad-hoc, мне он нравится.
Я лишь показываю, что ad hoc полиморфизм в дотнете недоделан для случая генериков.
Т.е. для случая обычных типов — доделан. В случае же генериков — имеем потерю типизации.
А коль нет, то нет ad-hoc. Всё просто.
S>Все что сравнивает — делает это специальным образом для каждого типа.
Не для каждого типа, а для каждого семейства типов. Прочувствуйте разницу, как грится.
S>И любой тип, который ты подашь в IndexOf, будет требовать специального сравнения
Это уже за рамками рассматриваемого метда.
Ведь у нас наблюдается декомпозиция:
— есть параметрически полиморфная ф-ия IndexOf над семейством типов IList<T> where T : IEquatable<T>;
— есть реализации метода IEquatable<T>.Equals(T other); пусть для конкретных типов или их семейств — не важно, пусть даже на ad hoc.
Тут главное что?
Что всё вместе оно начинает работать уже на этапе компиляции и не потребует хакать систему типов в рантайм.
В общем, ждем допиливания дотнета до работающего варианта.
V>>Нет, не потерял. Параметрический полиморфизм НЕ требует работы ф-ии на ЛЮБЫХ входящих типах. Достаточно работы на более одном типе.
S>ЧТО??? По-твоему любая мономорфная функция параметрически полиморфна?
По-моему, путать "моно-" и "поли-" грешно.
V>>Тем не менее, методы каждой из версий класса List<T> параметрически полиморфны прямо по-определению параметрического полиморфизма.
S>Это не так.
Сначала я думал, что ты не понимаешь, что есть ad hoc полиморфизм.
Теперь получается, что и с параметрическим засада. ))
Приплыли.
S>И даже для невыдуманного List<T>. BinarySearch, Contains, IndexOf, LastIndexOf — ad hoc.
Я тебя понил. Вопрос: откуда ты вообще взял, что эти виды полиморфизма взаимоисключающи? Не видишь, разве, что это принципиально разные способы, которые нигде не пересекаются и не конфликтуют, т.е. прекрасно работают совместно?
V>>Я показал рядом пример с методами-расширениями в C#. Не компилируется.
S>Только потому что тебе нужна перегрузка и с ограничением и без одновременно.
Э-э-э...
Иногда мне сложно понять, где ты издеваешься, а где просто невнимателен.
ОК, пусть будет всегда с ограничением, но ограничения пусть будут разные. Всё-равно тот пример не скомпилируется.
Это же не принципиально — я просто показал, что разные ограничения не означают разные типы аргументов.
S>Естественно. Но это ничего не меняет в отношении ad hoc.
Стирание информации о типе — это не естественно. И это МЕШАЕТ нормальному статически-компилируемому ad hoc.
V>>В реализации системных библиотек Linq.
V>>Происходит рантайм-проверка типа аргумента и ветвление алгоритма.
S>Ах, вот что ты называешь рефлексией? Ну делалось бы это через visitor... Что бы изменилось? Один хрен ad hoc. (ой, чувствую, щас начнется)
Ну так, лишний код, всё равно. Чаще всего из контекста виден точный тип (или видно больше деталей-ограничений). Если бы стирания не происходило, то все разруливалось бы статически.
S>После хаскельвики и просто вики?
После овладения навыками чтения технической литературы.
Я тебе привел из твоей же ссылки на вики точные цитаты Стрэчи, ты продолжаешь упрямиться.
ОК, дело такое...
V>>А зря. По всей этой ветке это был тот самый единственный, который необходимый и достаточный аргумент, дающий исчерпывающий мой поинт относительно проблем параметрического полиморфизма в C#.
S>Мы пока еще не договорились по поводу того, что считать параметрическим.
Мы с тобой и не договоримся.
Потому что продвижения нет.
Ты игноришь аргументы, игноришь цитаты, игноришь ссылки, игноришь всё.
Ты даже игноришь цитаты из своих собственных ссылок. ))
Это намеренный саботаж.
V>>В дотнете такое не компиллируется.
V>>А в Хаскеле подобный сценарий — это основа основ современных практик для этого языка.
S>Пусть, но это ad hoc.
Надоело.
Просто обращение к здравому смыслу.
Итак. Генерики дотнета считаются параметрическим полиморфизмом. Предлагаю тебе в этом месте прислушаться к мнению того самого "миллиона леммингов".
Я давал краткое определение параметрического полиморфизма:
если тело ф-ии явно или неявно параметризуется аргументом-типом — это параметрический полиморфизм.
Твой Карделли называл такие функции "шаблоном". Наверно поэтому появившиеся "шаблоны" в С++ приняли одноимённое название.
Всё вместе "оно" называется обобщённым программированием, наверно отсюда растут ноги у термина "генерик" у C# и Джавы.
Далее.
Вот очередная попытка определения из твоей вики:
Улыбнуло. Сказано верно, но само определения явно предназначено для людей, далеких от IT, или для новичков в IT.Параметрический полиморфизм позволяет определять функцию или тип данных обобщённо, так что значения обрабатываются идентично вне зависимости от их типа. Параметрически полиморфная функция использует аргументы на основе поведения, а не значения, апеллируя лишь к необходимым ей свойствам аргументов, что делает её применимой в любом контексте, где тип объекта удовлетворяет заданным требованиям поведения.
Наверно потому что вики для всех.
Давай переведём в наши координаты:
* "использует аргументы на основе поведения" — тут речь о "типизированном черном ящике", т.е. о "концепте", т.е. о паре { "черный ящик", "набор операций" };
* "делает её применимой в любом контексте, где тип объекта удовлетворяет заданным требованиям поведения" — тут речь о наличии "ограничений" полиморфного аргумента или просто его "типизации" (да, именно так и говорится, и это вполне грамотно); Это одно и то же, что первое, т.е. определение могло быть вдвое короче.
Вот тебе очередное определение параметрического полиморфизма.
Ты же упорно и 1-е и 2-е называешь ad hoc. )))
Или можно взять начало начал:
Итого, когда ты пишешь в дотнете where T : IEquatable<T> — ты частично определяешь тип T.ML ввел понятие параметризированного полиморфизма в языки.
Типы ML могут содержать переменные типов, которые могут быть означены разными типами в разных контекстах. Следовательно возможно частично определять информацию о типах и писать программы основанные на частично определенных типах, которые могут быть использованы на всем диапазоне этих типов.
Или когда в Хаскеле пишешь equal_to :: (Eq a) => ... — ты частично определяешь тип a.
Вот это неполное определение типа — это и есть основной/единственный признак именно параметрического полиморфизма, а вовсе не ad hoc.
А где появляется ad hoc — я уже много раз тебе писал. Медитировать до просветления, как грится.
S>Итак, предположим что это работало бы в дотнете.
Если язык позиционирует себя как статически-типизируемый, то обязано было бы.
V>>Если сделать как показал выше, то получим ошибку:
V>>
S>Так убери конкурирующую специализацию или переобзови ее другим именем.V>>error CS0111: Type 'MyExtentions1' already defines a member called 'IndexOf' with the same parameter types
Напротив, я записал её абсолютно верно, т.е. именно так, как требуется писать в статически-типизируемом языке, поддерживающем (якобы поддерживающем) параметрический полиморфизм.
S>Получишь 2 метода, у которых ad-hoc полиморфизм, но хоть они будут компилироваться и работать.
А мне надо не два, а один перегруженный метод.
V>>Если разнести эти определения по разным MyExtentions1 и MyExtentions2 и потом попытаться использовать ad-hoc полиморфизм на IndexOf:
S>Ты не можешь его попытаться использовать.
Верно не могу.
Именно это и порицается.
Потому что в Хаскеле и в С++ — могу.
S>Ты можешь его попытаться не использовать, но от ad-hoc ты никак не отделаешься.
Да не пытаюсь я отделаться от ad-hoc, мне он нравится.
Я лишь показываю, что ad hoc полиморфизм в дотнете недоделан для случая генериков.
Т.е. для случая обычных типов — доделан. В случае же генериков — имеем потерю типизации.
А коль нет типизации, то нет ad-hoc. Всё просто.
S>Все что сравнивает — делает это специальным образом для каждого типа.
Не для каждого типа, а для каждого семейства типов. Прочувствуйте разницу, как грится.
S>И любой тип, который ты подашь в IndexOf, будет требовать специального сравнения
Это уже за рамками рассматриваемого метда.
Ведь у нас наблюдается декомпозиция:
— есть параметрически полиморфная ф-ия IndexOf над семейством типов IList<T> where T : IEquatable<T>;
— есть реализации метода IEquatable<T>.Equals(T other); пусть для конкретных типов или их семейств — не важно, пусть даже на ad hoc.
Тут главное что?
Что всё вместе оно начинает работать уже на этапе компиляции и не потребует хакать систему типов в рантайм.
В общем, ждем допиливания дотнета до работающего варианта.
V>>Нет, не потерял. Параметрический полиморфизм НЕ требует работы ф-ии на ЛЮБЫХ входящих типах. Достаточно работы на более одном типе.
S>ЧТО??? По-твоему любая мономорфная функция параметрически полиморфна?
По-моему, путать "моно-" и "поли-" грешно.
V>>Тем не менее, методы каждой из версий класса List<T> параметрически полиморфны прямо по-определению параметрического полиморфизма.
S>Это не так.
Сначала я думал, что ты не понимаешь, что есть ad hoc полиморфизм.
Теперь получается, что и с параметрическим засада. ))
Приплыли.
S>И даже для невыдуманного List<T>. BinarySearch, Contains, IndexOf, LastIndexOf — ad hoc.
Я тебя понил. Вопрос: откуда ты вообще взял, что эти виды полиморфизма взаимоисключающи? Не видишь, разве, что это принципиально разные способы, которые нигде не пересекаются и не конфликтуют, т.е. прекрасно работают совместно?
V>>Я показал рядом пример с методами-расширениями в C#. Не компилируется.
S>Только потому что тебе нужна перегрузка и с ограничением и без одновременно.
Э-э-э...
Иногда мне сложно понять, где ты издеваешься, а где просто невнимателен.
ОК, пусть будет всегда с ограничением, но ограничения пусть будут разные. Всё-равно тот пример не скомпилируется.
Это же не принципиально — я просто показал, что разные ограничения не означают разные типы аргументов.
S>Естественно. Но это ничего не меняет в отношении ad hoc.
Стирание информации о типе — это не естественно. И это МЕШАЕТ нормальному статически-компилируемому ad hoc.
V>>В реализации системных библиотек Linq.
V>>Происходит рантайм-проверка типа аргумента и ветвление алгоритма.
S>Ах, вот что ты называешь рефлексией? Ну делалось бы это через visitor... Что бы изменилось? Один хрен ad hoc. (ой, чувствую, щас начнется)
Ну так, лишний код, всё равно. Чаще всего из контекста виден точный тип (или видно больше деталей-ограничений). Если бы стирания не происходило, то все разруливалось бы статически.
S>После хаскельвики и просто вики?
После овладения навыками чтения технической литературы.
Я тебе привел из твоей же ссылки на вики точные цитаты Стрэчи, ты продолжаешь упрямиться.
ОК, дело такое...
V>>А зря. По всей этой ветке это был тот самый единственный, который необходимый и достаточный аргумент, дающий исчерпывающий мой поинт относительно проблем параметрического полиморфизма в C#.
S>Мы пока еще не договорились по поводу того, что считать параметрическим.
Мы с тобой и не договоримся.
Потому что продвижения нет.
Ты игноришь аргументы, игноришь цитаты, игноришь ссылки, игноришь всё.
Ты даже игноришь цитаты из своих собственных ссылок. ))
Это намеренный саботаж.
V>>В дотнете такое не компиллируется.
V>>А в Хаскеле подобный сценарий — это основа основ современных практик для этого языка.
S>Пусть, но это ad hoc.
Надоело.
Просто обращение к здравому смыслу.
Итак. Генерики дотнета считаются параметрическим полиморфизмом. Предлагаю тебе в этом месте прислушаться к мнению того самого "миллиона леммингов".
Я давал краткое определение параметрического полиморфизма:
если тело ф-ии явно или неявно параметризуется аргументом-типом — это параметрический полиморфизм.
Твой Карделли называл такие функции "шаблоном". Наверно поэтому появившиеся "шаблоны" в С++ приняли одноимённое название.
Всё вместе "оно" называется обобщённым программированием, наверно отсюда растут ноги у термина "генерик" у C# и Джавы.
Далее.
Вот очередная попытка определения из твоей вики:
Улыбнуло. Сказано верно, но само определения явно предназначено для людей, далеких от IT, или для новичков в IT.Параметрический полиморфизм позволяет определять функцию или тип данных обобщённо, так что значения обрабатываются идентично вне зависимости от их типа. Параметрически полиморфная функция использует аргументы на основе поведения, а не значения, апеллируя лишь к необходимым ей свойствам аргументов, что делает её применимой в любом контексте, где тип объекта удовлетворяет заданным требованиям поведения.
Наверно потому что вики для всех.
Давай переведём в наши координаты:
* "использует аргументы на основе поведения" — тут речь о "типизированном черном ящике", т.е. о "концепте", т.е. о паре { "черный ящик", "набор операций" };
* "делает её применимой в любом контексте, где тип объекта удовлетворяет заданным требованиям поведения" — тут речь о наличии "ограничений" полиморфного аргумента или просто его "типизации" (да, именно так и говорится, и это вполне грамотно); Это одно и то же, что первое, т.е. определение могло быть вдвое короче.
Вот тебе очередное определение параметрического полиморфизма.
Ты же упорно и 1-е и 2-е называешь ad hoc. )))
Или можно взять начало начал:
Итого, когда ты пишешь в дотнете where T : IEquatable<T> — ты частично определяешь тип T.ML ввел понятие параметризированного полиморфизма в языки.
Типы ML могут содержать переменные типов, которые могут быть означены разными типами в разных контекстах. Следовательно возможно частично определять информацию о типах и писать программы основанные на частично определенных типах, которые могут быть использованы на всем диапазоне этих типов.
Или когда в Хаскеле пишешь equal_to :: (Eq a) => ... — ты частично определяешь тип a.
Вот это неполное определение типа — это и есть основной/единственный признак именно параметрического полиморфизма, а вовсе не ad hoc.
А где появляется ad hoc — я уже много раз тебе писал. Медитировать до просветления, как грится.