Информация об изменениях

Сообщение Re[21]: IEquatable<T> от 21.02.2017 12:05

Изменено 21.02.2017 12:29 vdimas

Re[21]: IEquatable<T>
Здравствуйте, samius, Вы писали:

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

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

Я еще в школе учился, когда уже попробовали:

Object Pascal (с англ. — «Объектный Паскаль») — язык программирования, разработанный в фирме Apple Computer в 1986 году.
Введена перегрузка процедур и функций.



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

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

Садись, два.
public int List<T>::IndexOf(T item) {}
public static int Array::IndexOf<T>(T[] array, T value)
...


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

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

Ты-то тут причём? Речь про дотнет.
Дотнет на сейчас не в силах. ОК.
Не сомневаюсь, что рано или поздно станет в силах.
Там нагнали нейтивных программистов, они наведут порядок в этом бардаке.


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

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

Наоборот, шло обсуждение недоделанности дотнета, в ходе которого выяснились разночтения по терминам.

Но это НЕ важно для целей демонстрации недоделаности дотнета.
Бо я тебе и без терминов, НА ПАЛЬЦАХ и примерах, в том числе приводя аналогичные примеры на С++ и Хаскеле уже всё показал, что с дотнетом не так.

Я могу повторить свои объяснения в любой абстрактной терминологии, которая не пересекается с имеющейся.
Вот давай назовём одно сепульками, другое ардритами, договоримся где-то. Спорный момент (совместная работа ad hoc и параметрического П) давай назовём энтеропией. Мне несложно объяснить в любых координатах. Но это не отменяет того, что тебе сложно ПОНЯТЬ.


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

V>>Ведь у нас наблюдается декомпозиция:
V>>- есть параметрически полиморфная ф-ия IndexOf над семейством типов IList<T> where T : IEquatable<T>;
S>нету такой.

Опять плаваешь по основам.
Я рядом советовал тебе освежить паттерн "Шаблонный метод".
Так вот, тот IndexOf, который работает через компарер, — это классический пример этого паттерна.


S>Есть ad-hoc полиморфная.


Сам IndexOf или вызываемый изнутри неё метод компарера?


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

S>Работает и хакать не требует, верно.

Сейчас требуется хакать.
Из-за стирания типов невозможно создать требуемый компарер простой операцией new.


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

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

Для 2017-го года негусто, если в библиотеке http://www.rsdn.org/forum/prj.codejam требуется кодогенерация/клонирование для повышения эффективности.


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

S>>>ЧТО??? По-твоему любая мономорфная функция параметрически полиморфна?
V>>По-моему, путать "моно-" и "поли-" грешно.
S>Но функция, работающая на одном типе мономорфна. Или я что-то пропустил?

Упустил выделенное.
Троллишь, не?


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

S>Для деления PP/AH это не верно.

Я задал тебе прямой вопрос — покажи мне утверждения про взаимоисключащие признаки таких видов полиморфизма.
Во многих классификациях признаки не взаимоисключающие, а ортогональные.

Показать не можешь? Значит сидишь и думаешь.


S>PP исключает специальные знания о типе.


Садись, два.
"Истинный PP" по Карделли ТРЕБУЕТ специальных знаний о типе.
Потому что без хотя бы частичного определения типа тебе недоступны операции над ним.


V>>Это же не принципиально — я просто показал, что разные ограничения не означают разные типы аргументов.

S>Пусть ограничения разные. Так что доказывает твой пример в отношении PP/AH?

Что в дотнете происходит стирание типов, поэтому невозможен AH над частично определёнными типами.


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

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

За это в 2017-м пора уже расстреливать! ))


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

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

Рассуждая в этом направлении можно было ограничиться скриптовыми языками с динамической типизацией.
Нафига какой-то там статический вывод типов нужен? Что за блажь? ))


S>Я тебе приводил точные цитаты хаскельвики, и ты продолжаешь упрямиться.


Приведи еще раз на русском.
Потому что насчёт английского ты стал спекулировать насчёт "you can".
Действительно, в английском эта фраза двусмыслена. В первом смысле она полностью подтверждает мой поинт, где я говорю о совместной работе разных видов полиморфизма. А во втором даёт тебе простор для спекуляций.

ОК. Давай недвусмысленную цитату.


V>>Потому что продвижения нет.

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

Я приводил тебе цитаты из твоего Карделли и даже из твоих ссылок на Вики.
Ты проигнорил ИХ ВСЕ.
Саботаж, троллинг.

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

S>Разве? Я ими руководствуюсь в определении PP/AH.

Ты руководствуешься только своей безграмотностью и неумением понимать прочитанное.

Но этого мало — ты откровенно некрасиво поступаешь в процессе обсуждения.
Это было нагло — аккуратно стереть цитаты из собственных ссылок как неудобные, и продолжил гнуть своё.
Причем, ты продолжаешь шнуть противоречащее приведенным ТОБОЙ же ссылкам.

Кароч, сел в лужу, имей смелость это признать.


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


Мощно задвинул.
"Параметрический полиморзм с ограничениями" — это не "параметрический полиморизм".

Коля Иванов, какая у тебя фамилия?


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

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

Пирс и Чёрч их тоже выдумали?
Это терминология.

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

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

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


Длиннющая цитата о том, чтобы показать, что параметрически-полимофные ф-ии называются так же генериками?
И что такой функциональный (опять и снова!!!) тип считается полиморфным?
Так это было возражение или согласие?


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

S>

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

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

Замечу, что ты уже второй раз попалился незнанием английского.
Есть переведённая эта же работа в Сети в сводобном доступе, читай ей.
Ты не прочитанного:

Parametric polymorphism is obtained when a function works uniformly on a range of types

Ключевое выделил. Чтобы получить range, его надо как-то задать в конкретном ЯП.
Например, в Хаскеле "range of types" задаётся классом типов.


V>>Сказано верно, но само определения явно предназначено для людей, далеких от IT, или для новичков в IT.

S>Удивляет, что тебе непонятно в этом определении?

Меня удивляет, что тебе непонятно вот это:

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

Поведение для абстрактных типов в языке Хаскель можно задать только через классы типов.


S>Если это сказано верно


Сказано верно.


S>то какое отношение к PP имеет твое собственное определение, не подразумевающее "вне зависимости от их типа"?


Вот моё определение:

если тело ф-ии явно или неявно параметризуется аргументом-типом — это параметрический полиморфизм

В отличие от Вики, оно дано для программистов, поэтому выглядит кратко.
Более того, в Вики дан вариант "типизированного параметрического полиморфизма", а это лишь разновидность "параметрического полиморфизма".

Или какое из слов/фраз тебе не понятно?
Слово "параметризуется" понятно?
Выражение "явно или неявно" — понятно? Или нужны примеры?
"Аргумент-тип" понятно или вызывает трудности?

Потому что ты уже бредишь, если утверждаешь, что моё определение не подразумевает "вне зависимости от их типа".
Наоборот, моё определение как раз предполагает одно и то же тело функции для МНОГИХ (более одного) типов аргумента.


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

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

В дестад, ясельную группу.
Ты уже по-русски технические тексты не понимаешь. ))


S>набор операций над типом зависим от типа.


Для частично определённых типов набор операций независим от конкретного типа. Через такой набор операций задаётся сразу группа типов, имеющих эти же операции.


S>Все, что использует набор операций (хотья прямо, хоть косвенно через ящик), имеет зависимость от типа.


Или от группы типов, Ы-Ы-Ы.
Видишь, как ты плаваешь в самих основах? ))

Ты не понимаешь самих основ даже банального ООП (не то, что ФП).
ты не понимаешь сути интерфейсов-конйептов, не понимаешь роли абстрактных классов.
Ты не понимаешь принцип подстановки Лисков.

Всё потому, что ты не понимаешь отличия абстрактного типа от монотипа.

Абстра́ктный тип да́нных (АТД) — это множество объектов, определяемое списком компонентов (операций , применимых к этим объектам, и их свойств). Вся внутренняя структура такого типа спрятана от разработчика программного обеспечения — в этом и заключается суть абстракции.

Абстрактный тип данных определяет набор функций, независимых от конкретной реализации типа, для оперирования его значениями.


Вот. Теперь ты показал, что загвоздка у тебя была вовсе не в ad hoc и не в параметрическом полиморфизме.
У тебя сложности с самыми базовыми вещами — абстрагированием, как идиомы разработки ПО. ))

Получается, что ты не понимаешь того трюка, что в конкретном месте прикладного алгоритма нам зачастую нужен не весь набор операций "конкретных типов", но достаточен лишь некий "концепт", т.е. ограниченный лишь нуждами конкретного прикладного алгоритма набор этих операций.
(Паттерн "Шаблонный метод" — основа ВСЕХ поведенческих паттернов из GoF)


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

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

Я нахожу странным, что ты споришь не с моими утверждениями, а непонятно с чем.
"тип объекта удовлетворяет заданным требованиям поведения" означает ограничение/типизацию аргумента полиморфной ф-ии или нет?

А приведенный там примеры — это высер вот этого человека. Укушенный узколобый НЕ программист во всей красе. Полутеоретик-полуисследователь.

Приведенные им в кач-ве примеров параметрического полиморфизма относятся к структурному полиморфизму, вот его примеры:

datatype 'a foo = A of 'a
                | B of ('a * 'a)
                | C

всякая функция над ним будет иметь вид
fun bar (p:'a foo) =
   case p of
        A x => ...
      | B (x,y) => ...
      | C => ...


Вопрос. По твоей "собственной" классификации, вот по твоему чутью, выражение вида:
   case p of
        A x => ...
      | B (x,y) => ...
      | C => ...

это уже ad hoc или еще нет?


S>Ты утверждаешь что определение указывает на наличие ограничений


Само определение? — несомненно:

где тип объекта удовлетворяет заданным требованиям поведения.



S>так где же ограничения в нижеследующих примерах List a, length и map?


Помнится, тебя в Хаскель-Вики тоже смутил именно пример! ))

Смотрим пример по ссылке:
data List a = Nil | Cons a (List a)

List — идентфикатор типа,
Nil, Cons — идентификаторы специальный функий-"конструкторов" в терминах ML.

length :: List a -> Integer

Объявление читается так: есть черный ящик, производный от a, для которого определены функции-конструкторы Nil и Cons.
А так же доступна функциональность паттерн-матчинга в зависимости от конструктора.

Для пущего понимания дополню, что типы-суммы в Хаскеле — это всегда ссылочный тип!
Так же как абстрактный тип в С++ — это только ссылочный тип.
Помнишь я указывал, почему так? Потому что физический размер ссылки одинаков для разных типов.
Итого, результат конструктора Nil и результат конструктора Cons a можно хранить в одной ссылочной переменной.

Еще рядом из вики:

Просвечивающие суммы Харпера — Лилибриджа

Наиболее сложной разновидностью записей являются зависимые записи. Такие записи могут включать в себя типы наравне с «обычными» значениями (материализованные типы, reified (англ.) types[9]), причём термы и типы, следующие далее по порядку в теле записи, могут быть определены на основе предшествующих им. Такие записи соответствуют «слабым суммам» из теории зависимых типов, также известным как «экзистенциалы», и служат наиболее общим обоснованием систем модулей языков программирования.


К чему я это?
Что "типы без ограничений" в хаскеле тоже есть — те самые «экзистенциалы».
Вот материал "для чайников" в попытыке отделить мух от котлет:
https://habrahabr.ru/post/207126/

Вот оттуда про пример с List a:

Обобщённые АТД отличаются от обычных тем, что урезают и специализируют итоговый тип.
В Хаскеле используется «функциональная» запись этих данных.
Давайте перепишем простой тип данных в новом синтаксисе:

data List a = Nil | Cons a (List a)

data List a where
    Nil  ::                List a
    Cons :: a -> List a -> List a

Итого, Nil и Cons — это функции.


Еще из вики, "Полиморфное исчисление записей Охори":

Единственная полиморфная операция, предусмотренная этим исчислением — операция извлечения поля.

Помнишь я выше предлагал перевод "структурного полиморфизма" в обычный через введение т.н. "селекторов"?

Например, в C# такой элемент языка как Property может быть абстрактными, виртуальными, быть членом интерфейса — это оно и есть.

Так вот, весь этот полиморфизм записей в случае размещения в модулях (абстракциях) в том же Хаскеле именно через селекторы и работает, т.е. через обычный полиморфизм. Чудес не бывает.

Просто ты хорошо понимаешь дотнет, где за объявлением автосвойства (выглядят как поле данных) всё-равно стоят две функции — сеттер и геттер (ан нет, это селекторы данных, а не сами данные). Но аналогичную ситуацию в Хаскеле не понимаешь и считаешь, что оно работает как-то там "само", угу. Да точно так же и работает. ))


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

S>И там явно упомянута независимость от типа.

Там упомянуто "удовлетворение ограничениям". ЧТД.


V>>Ты же упорно и 1-е и 2-е называешь ad hoc. )))

S>То, что требуует ограничений, я упорно называю AH.

Но я тебе процитировал определения ПП, и там сказано об ограничениях.
Как же так, а?


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

V>>

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

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

S>Это историческая справка.

Верно. Это работа Карделли на русском.
Это была историческая справка появления термина "параметрический полиморфизм". Зачем? Потому что в следующей главе затем он вводит понятие "нетипизированного лямбда исчисления" и доопределяет параметрический полиморфизм до типизированного варианта и нетипизированного.

Типизированный вариант — это типа генериков дотнета или класса типов в Хаскель, т.е. ПП в ограничениях.
Нетипизированный — это "шаблонные ф-ии", т.е. генераторы кода.


На русском — ну чтобы сложностей не возникало.
Карделли не ставил себе задачу переопределить/оспорить формулировку ПП, он исследовал полиморфизм в различных языках.
За ПП он оставил исходное понятие из ML.


S>Я не вижу здесь формальной связи между введением понятия ПП и возможностю частично определять информацию.


О! Уже и на русском сложности. ))
А я даже жирным выделил, чтобы лучше видно было.
Карделли описал этот ПП в ML.
Описал вполне однозначно — через частичное определение типов.
В Хаскеле, наследнике ML, их называют классами типов или обобщенными типами данных.

Квантора всеобщности, на котором ты настаиваешь, разумеется нет.
Есть квантор принадлежности. Оттуда же:

Фраза имеет тип может интерпретироваться как членство в подходящем множестве. Так как идеалы в V могут перекрываться, то значения могут иметь много типов.

Угу. В дотнете — несколько ограничений, в Хаскеле — несколько базовых классов для определяемых данных.

Кстате, смотрю, Карделли рассуждает так же как я относительно идентичности механизмов ПП и ООП-полиморфизма:

Супертипы в объектно-ориентированных языках, могут быть представлены как параметрические типы, чьи параметры опущены пользователем.



V>>Итого, когда ты пишешь в дотнете where T : IEquatable<T> — ты частично определяешь тип T.

S>Верно.
V>>Или когда в Хаскеле пишешь equal_to :: (Eq a) => ... — ты частично определяешь тип a.
S>Тоже. Но чистый PP не допускает специальных операций над экземпляром типа.

Я не знаю, что такое "чистый ПП". ))

Я знаю, что Карделли называл "истинным полиморфизмом" конкретно "типизированный ПП". Т.е. ПП в ограничениях.
Т.е., именно параметрический полиморфизм в ограничениях называется "истинным полиморфизмом".

С другой стороны, "истинный полиморфизм" не является термином, это просто эдакая эмоционально-окрашенная формулировка в главе с рассуждениями о типизированном лямбда-исчислении. Потому что в случае "истинного полиморфизма" тип результата ф-ии выводим, а в случае ad hoc — дудки.


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

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

Но ты за несколько десятков постов не смог подтвердить ни одной цитатой, что признак параметрического — это отсутствие ограничений.
А я тебе привел просто море цитат, что сам ПП изначально появился лишь в варианте с ограничениями, а уже потом пошли варианты без ограничений (изначально только в С++, ы-ы-ы... вот буквально несколько лет назад появились шаблонные типы и в одном диалектов Хаскеля — HGC).


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

S>После тебя

Ну я-то по профильной специальности в ВУЗ-е учился и даже был круглым отличником с повышенной стипендией. ))
Хотя, косил безбожно все лекции и практики, появляясь на занятиях пару раз в неделю (некогда было — спортом занимался).
Мне быстрее прочитать и разобраться самому.
Ты так не можешь, как я погляжу.
Re[21]: IEquatable<T>
Здравствуйте, samius, Вы писали:

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

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

Я еще в школе учился, когда уже попробовали:

Object Pascal (с англ. — «Объектный Паскаль») — язык программирования, разработанный в фирме Apple Computer в 1986 году.
Введена перегрузка процедур и функций.



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

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

Садись, два.
public int List<T>::IndexOf(T item) {}
public static int Array::IndexOf<T>(T[] array, T value)
...


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

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

Ты-то тут причём? Речь про дотнет.
Дотнет на сейчас не в силах. ОК.
Не сомневаюсь, что рано или поздно станет в силах.
Там нагнали нейтивных программистов, они наведут порядок в этом бардаке.


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

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

Наоборот, шло обсуждение недоделанности дотнета, в ходе которого выяснились разночтения по терминам.

Но это НЕ важно для целей демонстрации недоделаности дотнета.
Бо я тебе и без терминов, НА ПАЛЬЦАХ и примерах, в том числе приводя аналогичные примеры на С++ и Хаскеле уже всё показал, что с дотнетом не так.

Я могу повторить свои объяснения в любой абстрактной терминологии, которая не пересекается с имеющейся.
Вот давай назовём одно сепульками, другое ардритами, договоримся где-то. Спорный момент (совместная работа ad hoc и параметрического П) давай назовём энтеропией. Мне несложно объяснить в любых координатах. Но это не отменяет того, что тебе сложно ПОНЯТЬ.


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

V>>Ведь у нас наблюдается декомпозиция:
V>>- есть параметрически полиморфная ф-ия IndexOf над семейством типов IList<T> where T : IEquatable<T>;
S>нету такой.

Опять плаваешь по основам.
Я рядом советовал тебе освежить паттерн "Шаблонный метод".
Так вот, тот IndexOf, который работает через компарер, — это классический пример этого паттерна.


S>Есть ad-hoc полиморфная.


Сам IndexOf или вызываемый изнутри неё метод компарера?


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

S>Работает и хакать не требует, верно.

Сейчас требуется хакать.
Из-за стирания типов невозможно создать требуемый компарер простой операцией new.


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

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

Для 2017-го года негусто, если в библиотеке http://www.rsdn.org/forum/prj.codejam требуется кодогенерация/клонирование для повышения эффективности.


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

S>>>ЧТО??? По-твоему любая мономорфная функция параметрически полиморфна?
V>>По-моему, путать "моно-" и "поли-" грешно.
S>Но функция, работающая на одном типе мономорфна. Или я что-то пропустил?

Упустил выделенное.
Троллишь, не?


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

S>Для деления PP/AH это не верно.

Я задал тебе прямой вопрос — покажи мне утверждения про взаимоисключащие признаки таких видов полиморфизма.
Во многих классификациях признаки не взаимоисключающие, а ортогональные.

Показать не можешь? Значит сидишь и думаешь.


S>PP исключает специальные знания о типе.


Садись, два.
"Истинный PP" по Карделли ТРЕБУЕТ специальных знаний о типе.
Потому что без хотя бы частичного определения типа тебе недоступны операции над ним.


V>>Это же не принципиально — я просто показал, что разные ограничения не означают разные типы аргументов.

S>Пусть ограничения разные. Так что доказывает твой пример в отношении PP/AH?

Что в дотнете происходит стирание типов, поэтому невозможен AH над частично определёнными типами.


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

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

За это в 2017-м пора уже расстреливать! ))


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

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

Рассуждая в этом направлении можно было ограничиться скриптовыми языками с динамической типизацией.
Нафига какой-то там статический вывод типов нужен? Что за блажь? ))


S>Я тебе приводил точные цитаты хаскельвики, и ты продолжаешь упрямиться.


Приведи еще раз на русском.
Потому что насчёт английского ты стал спекулировать насчёт "you can".
Действительно, в английском эта фраза двусмыслена. В первом смысле она полностью подтверждает мой поинт, где я говорю о совместной работе разных видов полиморфизма. А во втором даёт тебе простор для спекуляций.

ОК. Давай недвусмысленную цитату.


V>>Потому что продвижения нет.

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

Я приводил тебе цитаты из твоего Карделли и даже из твоих ссылок на Вики.
Ты проигнорил ИХ ВСЕ.
Саботаж, троллинг.

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

S>Разве? Я ими руководствуюсь в определении PP/AH.

Ты руководствуешься только своей безграмотностью и неумением понимать прочитанное.

Но этого мало — ты откровенно некрасиво поступаешь в процессе обсуждения.
Это было нагло — аккуратно стереть цитаты из собственных ссылок как неудобные, и продолжил гнуть своё.
Причем, ты продолжаешь шнуть противоречащее приведенным ТОБОЙ же ссылкам.

Кароч, сел в лужу, имей смелость это признать.


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


Мощно задвинул.
"Параметрический полиморзм с ограничениями" — это не "параметрический полиморизм".

Коля Иванов, какая у тебя фамилия?


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

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

Пирс и Чёрч их тоже выдумали?
Это терминология.

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

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

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


Длиннющая цитата о том, чтобы показать, что параметрически-полимофные ф-ии называются так же генериками?
И что такой функциональный (опять и снова!!!) тип считается полиморфным?
Так это было возражение или согласие?


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

S>

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

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

Замечу, что ты уже второй раз попалился незнанием английского.
Есть переведённая эта же работа в Сети в сводобном доступе, читай ей.
Ты не понял прочитанного:

Parametric polymorphism is obtained when a function works uniformly on a range of types

Ключевое выделил. Чтобы получить range, его надо как-то задать в конкретном ЯП.
Например, в Хаскеле "range of types" задаётся классом типов.


V>>Сказано верно, но само определения явно предназначено для людей, далеких от IT, или для новичков в IT.

S>Удивляет, что тебе непонятно в этом определении?

Меня удивляет, что тебе непонятно вот это:

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

Поведение для абстрактных типов в языке Хаскель можно задать только через классы типов.


S>Если это сказано верно


Сказано верно.


S>то какое отношение к PP имеет твое собственное определение, не подразумевающее "вне зависимости от их типа"?


Вот моё определение:

если тело ф-ии явно или неявно параметризуется аргументом-типом — это параметрический полиморфизм

В отличие от Вики, оно дано для программистов, поэтому выглядит кратко.
Более того, в Вики дан вариант "типизированного параметрического полиморфизма", а это лишь разновидность "параметрического полиморфизма".

Или какое из слов/фраз тебе не понятно?
Слово "параметризуется" понятно?
Выражение "явно или неявно" — понятно? Или нужны примеры?
"Аргумент-тип" понятно или вызывает трудности?

Потому что ты уже бредишь, если утверждаешь, что моё определение не подразумевает "вне зависимости от их типа".
Наоборот, моё определение как раз предполагает одно и то же тело функции для МНОГИХ (более одного) типов аргумента.


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

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

В дестад, ясельную группу.
Ты уже по-русски технические тексты не понимаешь. ))


S>набор операций над типом зависим от типа.


Для частично определённых типов набор операций независим от конкретного типа. Через такой набор операций задаётся сразу группа типов, имеющих эти же операции.


S>Все, что использует набор операций (хотья прямо, хоть косвенно через ящик), имеет зависимость от типа.


Или от группы типов, Ы-Ы-Ы.
Видишь, как ты плаваешь в самих основах? ))

Ты не понимаешь самих основ даже банального ООП (не то, что ФП).
ты не понимаешь сути интерфейсов-конйептов, не понимаешь роли абстрактных классов.
Ты не понимаешь принцип подстановки Лисков.

Всё потому, что ты не понимаешь отличия абстрактного типа от монотипа.

Абстра́ктный тип да́нных (АТД) — это множество объектов, определяемое списком компонентов (операций , применимых к этим объектам, и их свойств). Вся внутренняя структура такого типа спрятана от разработчика программного обеспечения — в этом и заключается суть абстракции.

Абстрактный тип данных определяет набор функций, независимых от конкретной реализации типа, для оперирования его значениями.


Вот. Теперь ты показал, что загвоздка у тебя была вовсе не в ad hoc и не в параметрическом полиморфизме.
У тебя сложности с самыми базовыми вещами — абстрагированием, как идиомы разработки ПО. ))

Получается, что ты не понимаешь того трюка, что в конкретном месте прикладного алгоритма нам зачастую нужен не весь набор операций "конкретных типов", но достаточен лишь некий "концепт", т.е. ограниченный лишь нуждами конкретного прикладного алгоритма набор этих операций.
(Паттерн "Шаблонный метод" — основа ВСЕХ поведенческих паттернов из GoF)


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

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

Я нахожу странным, что ты споришь не с моими утверждениями, а непонятно с чем.
"тип объекта удовлетворяет заданным требованиям поведения" означает ограничение/типизацию аргумента полиморфной ф-ии или нет?

А приведенный там примеры — это высер вот этого человека. Укушенный узколобый НЕ программист во всей красе. Полутеоретик-полуисследователь.

Приведенные им в кач-ве примеров параметрического полиморфизма относятся к структурному полиморфизму, вот его примеры:

datatype 'a foo = A of 'a
                | B of ('a * 'a)
                | C

всякая функция над ним будет иметь вид
fun bar (p:'a foo) =
   case p of
        A x => ...
      | B (x,y) => ...
      | C => ...


Вопрос. По твоей "собственной" классификации, вот по твоему чутью, выражение вида:
   case p of
        A x => ...
      | B (x,y) => ...
      | C => ...

это уже ad hoc или еще нет?


S>Ты утверждаешь что определение указывает на наличие ограничений


Само определение? — несомненно:

где тип объекта удовлетворяет заданным требованиям поведения.



S>так где же ограничения в нижеследующих примерах List a, length и map?


Помнится, тебя в Хаскель-Вики тоже смутил именно пример! ))

Смотрим пример по ссылке:
data List a = Nil | Cons a (List a)

List — идентфикатор типа,
Nil, Cons — идентификаторы специальный функий-"конструкторов" в терминах ML.

length :: List a -> Integer

Объявление читается так: есть черный ящик, производный от a, для которого определены функции-конструкторы Nil и Cons.
А так же доступна функциональность паттерн-матчинга в зависимости от конструктора.

Для пущего понимания дополню, что типы-суммы в Хаскеле — это всегда ссылочный тип!
Так же как абстрактный тип в С++ — это только ссылочный тип.
Помнишь я указывал, почему так? Потому что физический размер ссылки одинаков для разных типов.
Итого, результат конструктора Nil и результат конструктора Cons a можно хранить в одной ссылочной переменной.

Еще рядом из вики:

Просвечивающие суммы Харпера — Лилибриджа

Наиболее сложной разновидностью записей являются зависимые записи. Такие записи могут включать в себя типы наравне с «обычными» значениями (материализованные типы, reified (англ.) types[9]), причём термы и типы, следующие далее по порядку в теле записи, могут быть определены на основе предшествующих им. Такие записи соответствуют «слабым суммам» из теории зависимых типов, также известным как «экзистенциалы», и служат наиболее общим обоснованием систем модулей языков программирования.


К чему я это?
Что "типы без ограничений" в хаскеле тоже есть — те самые «экзистенциалы».
Вот материал "для чайников" в попытыке отделить мух от котлет:
https://habrahabr.ru/post/207126/

Вот оттуда про пример с List a:

Обобщённые АТД отличаются от обычных тем, что урезают и специализируют итоговый тип.
В Хаскеле используется «функциональная» запись этих данных.
Давайте перепишем простой тип данных в новом синтаксисе:

data List a = Nil | Cons a (List a)

data List a where
    Nil  ::                List a
    Cons :: a -> List a -> List a

Итого, Nil и Cons — это функции.


Еще из вики, "Полиморфное исчисление записей Охори":

Единственная полиморфная операция, предусмотренная этим исчислением — операция извлечения поля.

Помнишь я выше предлагал перевод "структурного полиморфизма" в обычный через введение т.н. "селекторов"?

Например, в C# такой элемент языка как Property может быть абстрактными, виртуальными, быть членом интерфейса — это оно и есть.

Так вот, весь этот полиморфизм записей в случае размещения в модулях (абстракциях) в том же Хаскеле именно через селекторы и работает, т.е. через обычный полиморфизм. Чудес не бывает.

Просто ты хорошо понимаешь дотнет, где за объявлением автосвойства (выглядят как поле данных) всё-равно стоят две функции — сеттер и геттер (ан нет, это селекторы данных, а не сами данные). Но аналогичную ситуацию в Хаскеле не понимаешь и считаешь, что оно работает как-то там "само", угу. Да точно так же и работает. ))


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

S>И там явно упомянута независимость от типа.

Там упомянуто "удовлетворение ограничениям". ЧТД.


V>>Ты же упорно и 1-е и 2-е называешь ad hoc. )))

S>То, что требуует ограничений, я упорно называю AH.

Но я тебе процитировал определения ПП, и там сказано об ограничениях.
Как же так, а?


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

V>>

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

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

S>Это историческая справка.

Верно. Это работа Карделли на русском.
Это была историческая справка появления термина "параметрический полиморфизм". Зачем? Потому что в следующей главе затем он вводит понятие "нетипизированного лямбда исчисления" и доопределяет параметрический полиморфизм до типизированного варианта и нетипизированного.

Типизированный вариант — это типа генериков дотнета или класса типов в Хаскель, т.е. ПП в ограничениях.
Нетипизированный — это "шаблонные ф-ии", т.е. генераторы кода.


На русском — ну чтобы сложностей не возникало.
Карделли не ставил себе задачу переопределить/оспорить формулировку ПП, он исследовал полиморфизм в различных языках.
За ПП он оставил исходное понятие из ML.


S>Я не вижу здесь формальной связи между введением понятия ПП и возможностю частично определять информацию.


О! Уже и на русском сложности. ))
А я даже жирным выделил, чтобы лучше видно было.
Карделли описал этот ПП в ML.
Описал вполне однозначно — через частичное определение типов.
В Хаскеле, наследнике ML, их называют классами типов или обобщенными типами данных.

Квантора всеобщности, на котором ты настаиваешь, разумеется нет.
Есть квантор принадлежности. Оттуда же:

Фраза имеет тип может интерпретироваться как членство в подходящем множестве. Так как идеалы в V могут перекрываться, то значения могут иметь много типов.

Угу. В дотнете — несколько ограничений, в Хаскеле — несколько базовых классов для определяемых данных.

Кстате, смотрю, Карделли рассуждает так же как я относительно идентичности механизмов ПП и ООП-полиморфизма:

Супертипы в объектно-ориентированных языках, могут быть представлены как параметрические типы, чьи параметры опущены пользователем.



V>>Итого, когда ты пишешь в дотнете where T : IEquatable<T> — ты частично определяешь тип T.

S>Верно.
V>>Или когда в Хаскеле пишешь equal_to :: (Eq a) => ... — ты частично определяешь тип a.
S>Тоже. Но чистый PP не допускает специальных операций над экземпляром типа.

Я не знаю, что такое "чистый ПП". ))

Я знаю, что Карделли называл "истинным полиморфизмом" конкретно "типизированный ПП". Т.е. ПП в ограничениях.
Т.е., именно параметрический полиморфизм в ограничениях называется "истинным полиморфизмом".

С другой стороны, "истинный полиморфизм" не является термином, это просто эдакая эмоционально-окрашенная формулировка в главе с рассуждениями о типизированном лямбда-исчислении. Потому что в случае "истинного полиморфизма" тип результата ф-ии выводим, а в случае ad hoc — дудки.


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

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

Но ты за несколько десятков постов не смог подтвердить ни одной цитатой, что признак параметрического — это отсутствие ограничений.
А я тебе привел просто море цитат, что сам ПП изначально появился лишь в варианте с ограничениями, а уже потом пошли варианты без ограничений (изначально только в С++, ы-ы-ы... вот буквально несколько лет назад появились шаблонные типы и в одном диалектов Хаскеля — HGC).


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

S>После тебя

Ну я-то по профильной специальности в ВУЗ-е учился и даже был круглым отличником с повышенной стипендией. ))
Хотя, косил безбожно все лекции и практики, появляясь на занятиях пару раз в неделю (некогда было — спортом занимался).
Мне быстрее прочитать и разобраться самому.
Ты так не можешь, как я погляжу.