Re[20]: IEquatable<T>
От: samius Япония http://sams-tricks.blogspot.com
Дата: 21.02.17 06:42
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, samius, Вы писали:


S>>Итак, предположим что это работало бы в дотнете.


V>Если язык позиционирует себя как статически-типизируемый, то обязано было бы.

Паскаль статически типизируемый. Попробуй на нем!

S>>Так убери конкурирующую специализацию или переобзови ее другим именем.


V>Напротив, я записал её абсолютно верно, т.е. именно так, как требуется писать в статически-типизируемом языке, поддерживающем (якобы поддерживающем) параметрический полиморфизм.

IndexOf не параметрический метод

S>>Получишь 2 метода, у которых ad-hoc полиморфизм, но хоть они будут компилироваться и работать.


V>А мне надо не два, а один перегруженный метод.

Понятно. То что тебе надо, я отменить не в силах.


S>>Ты можешь его попытаться не использовать, но от ad-hoc ты никак не отделаешься.


V>Да не пытаюсь я отделаться от ad-hoc, мне он нравится.

V>Я лишь показываю, что ad hoc полиморфизм в дотнете недоделан для случая генериков.
Разве я предлагал обсуждать доделанность дотнета, прежде чем мы договоримся о терминах?

V>Т.е. для случая обычных типов — доделан. В случае же генериков — имеем потерю типизации.

V>А коль нет типизации, то нет ad-hoc. Всё просто.
что за потеря типизации? Дженерики стали object-ами или dynamic-ами?

S>>Все что сравнивает — делает это специальным образом для каждого типа.


V>Не для каждого типа, а для каждого семейства типов. Прочувствуйте разницу, как грится.

Разницы нет. Если специально — уже ad hoc, см определение, но не то, которого нет в Hott.

S>>И любой тип, который ты подашь в IndexOf, будет требовать специального сравнения


V>Это уже за рамками рассматриваемого метда.

V>Ведь у нас наблюдается декомпозиция:
V>- есть параметрически полиморфная ф-ия IndexOf над семейством типов IList<T> where T : IEquatable<T>;
нету такой. Есть ad-hoc полиморфная.
V>- есть реализации метода IEquatable<T>.Equals(T other); пусть для конкретных типов или их семейств — не важно, пусть даже на ad hoc.
Это есть, спорить не буду.

V>Тут главное что?

V>Что всё вместе оно начинает работать уже на этапе компиляции и не потребует хакать систему типов в рантайм.
Работает и хакать не требует, верно.

V>В общем, ждем допиливания дотнета до работающего варианта.

Ты жди, а по мне оно УЖЕ работает.

V>>>Нет, не потерял. Параметрический полиморфизм НЕ требует работы ф-ии на ЛЮБЫХ входящих типах. Достаточно работы на более одном типе.

S>>ЧТО??? По-твоему любая мономорфная функция параметрически полиморфна?

V>По-моему, путать "моно-" и "поли-" грешно.

Но функция, работающая на одном типе мономорфна. Или я что-то пропустил?

V>>>Тем не менее, методы каждой из версий класса List<T> параметрически полиморфны прямо по-определению параметрического полиморфизма.

S>>Это не так.

V>Сначала я думал, что ты не понимаешь, что есть ad hoc полиморфизм.

V>Теперь получается, что и с параметрическим засада. ))
V>Приплыли.
Поздравляю. Еще немного и получится, что засада не у меня.

S>>И даже для невыдуманного List<T>. BinarySearch, Contains, IndexOf, LastIndexOf — ad hoc.


V>Я тебя понил. Вопрос: откуда ты вообще взял, что эти виды полиморфизма взаимоисключающи? Не видишь, разве, что это принципиально разные способы, которые нигде не пересекаются и не конфликтуют, т.е. прекрасно работают совместно?

Для деления PP/AH это не верно. PP исключает специальные знания о типе. AH их подразумевает.

V>>>Я показал рядом пример с методами-расширениями в C#. Не компилируется.

S>>Только потому что тебе нужна перегрузка и с ограничением и без одновременно.

V>Э-э-э...

V>Иногда мне сложно понять, где ты издеваешься, а где просто невнимателен.
Здесь я внимателен, ибо тебе действительно нужно и то и другое, и ты об этом написал неоднократно.

V>ОК, пусть будет всегда с ограничением, но ограничения пусть будут разные. Всё-равно тот пример не скомпилируется.

V>Это же не принципиально — я просто показал, что разные ограничения не означают разные типы аргументов.
Пусть ограничения разные. Так что доказывает твой пример в отношении PP/AH?

S>>Естественно. Но это ничего не меняет в отношении ad hoc.


V>Стирание информации о типе — это не естественно. И это МЕШАЕТ нормальному статически-компилируемому ad hoc.

Стирание — это безобразно, конечно.


V>>>В реализации системных библиотек Linq.

V>>>Происходит рантайм-проверка типа аргумента и ветвление алгоритма.
S>>Ах, вот что ты называешь рефлексией? Ну делалось бы это через visitor... Что бы изменилось? Один хрен ad hoc. (ой, чувствую, щас начнется)

V>Ну так, лишний код, всё равно. Чаще всего из контекста виден точный тип (или видно больше деталей-ограничений). Если бы стирания не происходило, то все разруливалось бы статически.

Ну так лишний код — это не принципиальная невозможность.


S>>После хаскельвики и просто вики?


V>После овладения навыками чтения технической литературы.

V>Я тебе привел из твоей же ссылки на вики точные цитаты Стрэчи, ты продолжаешь упрямиться.
V>ОК, дело такое...
Я тебе приводил точные цитаты хаскельвики, и ты продолжаешь упрямиться.

S>>Мы пока еще не договорились по поводу того, что считать параметрическим.


V>Мы с тобой и не договоримся.

V>Потому что продвижения нет.
V>Ты игноришь аргументы, игноришь цитаты, игноришь ссылки, игноришь всё.
Твои аргументы опираются на определения, который ты не нашел в одной книге и потому сам выдумал. Игнорить их — самое благоразумное.

V>Ты даже игноришь цитаты из своих собственных ссылок. ))

Разве? Я ими руководствуюсь в определении PP/AH.
V>Это намеренный саботаж.

V>>>В дотнете такое не компиллируется.

V>>>А в Хаскеле подобный сценарий — это основа основ современных практик для этого языка.
S>>Пусть, но это ad hoc.

V>Надоело.

О, я только вошел во вкус...

V>Просто обращение к здравому смыслу.

V>Итак. Генерики дотнета считаются параметрическим полиморфизмом. Предлагаю тебе в этом месте прислушаться к мнению того самого "миллиона леммингов".
Генерики дотнета действительно считаются параметрическим полиморфизмом. С поправкой — там где нет ограничений. С ограничениями это bounded PP, см вики, нуба Карделли.

V>Я давал краткое определение параметрического полиморфизма:

V>если тело ф-ии явно или неявно параметризуется аргументом-типом — это параметрический полиморфизм.
Ну я же говорю, что ты их выдумываешь.

V>Твой Карделли называл такие функции "шаблоном". Наверно поэтому появившиеся "шаблоны" в С++ приняли одноимённое название.

V>Всё вместе "оно" называется обобщённым программированием, наверно отсюда растут ноги у термина "генерик" у C# и Джавы.
Вот сам Карделли

The functions that exhibit parametric polymorphism are also called generic functions. For example,
the length function from lists of arbitrary type to integers is called a generic length function. A generic
function is one which can work for arguments of many types, generally doing the same kind of work
independently of the argument type. If we consider a generic function as a single value, it has many
functional types and is therefore polymorphic. Ada generic functions are a special case of this concept of
generic

Только вот Карделли называет параметрическим полиморфизмом не те функции, которые параметризуются явно или неявно аргументом-типом. А

Strachey [Strachey 67] distinguished, informally, between two major kinds of polymorphism.
Parametric polymorphism is obtained when a function works uniformly on a range of types: these types
normally exhibit some common structure. Ad-hoc polymorphism is obtained when a function works, or
appears to work, on several different types (which may not exhibit a common structure) and may behave in
unrelated ways for each type.

Заметь, здесь AH противопоставляется PP.

V>Далее.

V>Вот очередная попытка определения из твоей вики:
V>

V>Параметрический полиморфизм позволяет определять функцию или тип данных обобщённо, так что значения обрабатываются идентично вне зависимости от их типа. Параметрически полиморфная функция использует аргументы на основе поведения, а не значения, апеллируя лишь к необходимым ей свойствам аргументов, что делает её применимой в любом контексте, где тип объекта удовлетворяет заданным требованиям поведения.

V>Улыбнуло. Сказано верно, но само определения явно предназначено для людей, далеких от IT, или для новичков в IT.
V>Наверно потому что вики для всех.
Удивляет, что тебе непонятно в этом определении? Если это сказано верно, то какое отношение к PP имеет твое собственное определение, не подразумевающее "вне зависимости от их типа"?

V>Давай переведём в наши координаты:

V>* "использует аргументы на основе поведения" — тут речь о "типизированном черном ящике", т.е. о "концепте", т.е. о паре { "черный ящик", "набор операций" };
Чушь. набор операций над типом зависим от типа. Все, что использует набор операций (хотья прямо, хоть косвенно через ящик), имеет зависимость от типа.

V>* "делает её применимой в любом контексте, где тип объекта удовлетворяет заданным требованиям поведения" — тут речь о наличии "ограничений" полиморфного аргумента или просто его "типизации" (да, именно так и говорится, и это вполне грамотно); Это одно и то же, что первое, т.е. определение могло быть вдвое короче.

Не находишь странным, что пример к этому определению не содержат ограничений, черных ящиков и вообще любых типоспецифичных операций? Ты утверждаешь что определение указывает на наличие ограничений, так где же ограничения в нижеследующих примерах List a, length и map?

V>Вот тебе очередное определение параметрического полиморфизма.

И там явно упомянута независимость от типа.
V>Ты же упорно и 1-е и 2-е называешь ad hoc. )))
То, что требуует ограничений, я упорно называю AH.

V>Или можно взять начало начал:

V>

V>ML ввел понятие параметризированного полиморфизма в языки.

V>Типы ML могут содержать переменные типов, которые могут быть означены разными типами в разных контекстах. Следовательно возможно частично определять информацию о типах и писать программы основанные на частично определенных типах, которые могут быть использованы на всем диапазоне этих типов.

Это историческая справка. Я не вижу здесь формальной связи между введением понятия ПП и возможностю частично определять информацию. Эта связь появилась с введением bounded PP.
V>Итого, когда ты пишешь в дотнете where T : IEquatable<T> — ты частично определяешь тип T.
Верно.
V>Или когда в Хаскеле пишешь equal_to :: (Eq a) => ... — ты частично определяешь тип a.
Тоже. Но чистый PP не допускает специальных операций над экземпляром типа.

V>Вот это неполное определение типа — это и есть основной/единственный признак именно параметрического полиморфизма, а вовсе не ad hoc.

Ошибаешься. Признак параметрического — отсутствие ограничений.

V>А где появляется ad hoc — я уже много раз тебе писал. Медитировать до просветления, как грится.

После тебя
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.