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

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


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

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

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

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

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

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

V>Садись, два.

V>
V>public int List<T>::IndexOf(T item) {}
V>public static int Array::IndexOf<T>(T[] array, T value)
V>...
V>

Я правильно понимаю, что ты мне продемонстрировал как бы "перегруженные" как бы "по первому аргументу" методы?
Если да, то уже этого достаточно что бы быть ad-hoc по Стрэчи, Карделли, Пирсу, викам и фиг знает еще по чему.

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

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

V>Ты-то тут причём? Речь про дотнет.

V>Дотнет на сейчас не в силах. ОК.
V>Не сомневаюсь, что рано или поздно станет в силах.
V>Там нагнали нейтивных программистов, они наведут порядок в этом бардаке.
Давай отложим тему бардака в дотнетах, пока, по-крайней мере не согласуем терминологию. Если у тебя еще есть желание и возможность, лучше сосредоточиться на этом.

S>>Разве я предлагал обсуждать доделанность дотнета, прежде чем мы договоримся о терминах?


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

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

V>Я могу повторить свои объяснения в любой абстрактной терминологии, которая не пересекается с имеющейся.

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

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

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

V>Опять плаваешь по основам.

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

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


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

И та и другой. Потому как результат IndexOf зависит от типа T, точнее от операций над его экземплярами. А PP по определению независим от типа и работает uniform для всех типов.

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

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

V>Сейчас требуется хакать.

V>Из-за стирания типов невозможно создать требуемый компарер простой операцией new.
Нет такой проблемы. Есть проблема выбора "наилучшего" способа сравнения (наилучшей реализации компарера) для типа T, указанного в рантайме. Проблема, введенная косяками в дизайне первых версий. Если предположить что не будет рефлексии, то не будет и MakeGenericType, все типы и интерфейсы, которые они реализуют, будут известны в компайл-тайм.

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

Я не знаю, что там требуется. Мне эффективности пока хватает. Я не стремлюсь решить любую задачу за наименьшее кол-во тактов.

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


V>Упустил выделенное.

V>Троллишь, не?
Вот здесь — искренне извини. Был невнимателен и как-то пропустил "на более". Да, троллил. Но потому что не верно понял. И ножкой вот так
Серьезно.
Теперь по существу. Карделли:

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.

Это то, что ассоциируется у меня с "на более одном типе".

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

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

V>Я задал тебе прямой вопрос — покажи мне утверждения про взаимоисключащие признаки таких видов полиморфизма.

V>Во многих классификациях признаки не взаимоисключающие, а ортогональные.
V>Показать не можешь? Значит сидишь и думаешь.
Вот. У Карделли

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

...
Parametric polymorphism is so called because the uniformity of type structure is normally achieved
by type parameters, but uniformity can be achieved in different ways, and this more general concept is
called universal polymorphism. Universally polymorphic functions will normally work on an infinite
number of types (all the types having a given common structure), while an ad-hoc polymorphic function
will only work on a finite set of different and potentially unrelated types.

Здесь противопоставление. Но ключевое — либо для нескольких может вести по разному (цитата выше AH), либо для всех одинаково (PP). Да, мне не нравится здесь слово "range". Оно не переводится как "все".
Английская вики

Ad hoc polymorphism: when a function denotes different and potentially heterogeneous implementations depending on a limited range of individually specified types and combinations. Ad hoc polymorphism is supported in many languages using function overloading.
Parametric polymorphism: when code is written without mention of any specific type and thus can be used transparently with any number of new types. In the object-oriented programming community, this is often known as generics or generic programming. In the functional programming community, this is often shortened to polymorphism.

Противопоставляет и делает акцент на выделенном. Опустил subtype, речь не о нем. Он считается PP, но на множестве подтипов (без виртуальных методов).
Пирс

Parametric polymorphism, the topic of this chapter, allows a single piece of code to be typed “generically,” using variables in place of actual types, and then instantiated with particular types as needed. Parametric definitions are uniform: all of their instances behave the same.
...
Ad-hoc polymorphism, by contrast, allows a polymorphic value to exhibit different behaviors when “viewed” at different types.

Противопоставление. Ссылается на Стрэчи 67, Карделли 85. Не думаю, что Пирс понял их как-то не так.

https://wiki.haskell.org/Polymorphism

Parametric polymorphism refers to when the type of a value contains one or more (unconstrained) type variables, so that the value may adopt any type that results from substituting those variables with concrete types.
...
Since a parametrically polymorphic value does not "know" anything about the unconstrained type variables, it must behave the same regardless of its type. This is a somewhat limiting but extremely useful property known as parametricity.

Ad-hoc polymorphism refers to when a value is able to adopt any one of several types because it, or a value it uses, has been given a separate definition for each of those types.


Русскую вики уж не буду. Достаточно?

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


V>Садись, два.

V>"Истинный PP" по Карделли ТРЕБУЕТ специальных знаний о типе.
Можно цитату? Плохо верится. Но именно о PP, а не о bounded PP или inclusion/subtype (что не то же самое что bounded PP).
По моим источникам — does not "know" anything.

V>Потому что без хотя бы частичного определения типа тебе недоступны операции над ним.

Именно в этом смысл PP. Обобщенно, униформно, единым образом, ничего не зная о типе. Это даже не следует из перечисленных определений, это прямо в них написано. Наличие специальных знаний о типе как раз и отделяет AH от PP.

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

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

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

Я знаю, что в дотнете стирание типов происходит. Но со стертым типом ничего нельзя сделать. Это как плохой PP. Но если происходит восстановление, то это уже AH.

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


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

Лучше просто чморить.

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


V>Рассуждая в этом направлении можно было ограничиться скриптовыми языками с динамической типизацией.

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

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


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

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

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

Того же самого? Хорошо. В моей интерпретации (не заглядывая в справочники и транслэйты) это будет выглядеть так

You can recognise the presence of ad-hoc polymorphism by looking for constrained type variables:
Вы можете распознать присутствие AH полиморфизма, глядя на ограниченный тип переменных:
(выше мы видели в определениях, что присутствие AH исключает присутствие PP)

that is, variables that appear to the left of =>, like in elem :: (Eq a) => a -> [a] -> Bool.
то есть, переменные, которые появляются слева от знака =>, как в elem

Note that lookup :: (Eq a) => a -> [(a,b)] -> Maybe b exhibits both parametric (in b) and ad-hoc (in a) polymorphism.
Заметим, что lookup представляет оба полиморфизма: параметрический по b и ad-hoc по а.

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


V>Я приводил тебе цитаты из твоего Карделли и даже из твоих ссылок на Вики.

Приводил, но ты при этом на них не опирался, ты показывал какие они смешные, нет?
V>Ты проигнорил ИХ ВСЕ.
V>Саботаж, троллинг.
Ну конечно.

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

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

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

Я так не считаю.

V>Но этого мало — ты откровенно некрасиво поступаешь в процессе обсуждения.

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

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

Если бы я чувствовал что ты прав. Нет, не чувствую. Смелость тут не нужна пока.

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


V>Мощно задвинул.

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

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

Давай тогда учиться различать. По самому Карделли.

Type ::= ... | QuantifiedType
QuantifiedType ::=
∀A. Type | Universal Quantification
∃A. Type | Existential Quantification
∀A⊆Type. Type | ∃A⊆Type. Type Bounded Quantification

Видишь, Bounded требует знания о типе. А PP как раз не требует. Это их ключевое отличие. Говорить что оно одно и тоже — вот именно это задвиг.

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

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

V>Пирс и Чёрч их тоже выдумали?

Я не видел что бы Пирс такое задвигал. Можно цитату? А самого Черча я еще не изучал по этому поводу. Но вряд ли возможно такое, что Черч один что-то задвинул, а все остальные задвинули на него.
V>Это терминология.
Дада, давай все карты на стол.

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

V>>>Всё вместе "оно" называется обобщённым программированием, наверно отсюда растут ноги у термина "генерик" у C# и Джавы.
S>>Вот сам Карделли
V>Длиннющая цитата о том, чтобы показать, что параметрически-полимофные ф-ии называются так же генериками?
V>И что такой функциональный (опять и снова!!!) тип считается полиморфным?
V>Так это было возражение или согласие?
Это была поправка-уточнение.


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.

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

В чем именно?
V>Есть переведённая эта же работа в Сети в сводобном доступе, читай ей.
О, давай сравним

Parametric polymorphism is obtained when a function works uniformly on a range of types: these types normally exhibit some common structure.

Против

Параметрический полиморфизм получается при использовании шаблонных функций ( функция выполняет свой алгоритм на некотором диапозоне типов эти типы обладают определенной общей структурой).

Спасибо, поржал. Несопоставимо. Давненько я не наблюдал такой древний Promt, отредактированный студентом, не понимающим нихрена, в рамках сдачи тысяч по английскому.
Извини, своему английскому я доверяю немного более чем этому переводу. И тебе не советую ему доверять.

V>Ты не понял прочитанного:

V>

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

V>Ключевое выделил. Чтобы получить range, его надо как-то задать в конкретном ЯП.
V>Например, в Хаскеле "range of types" задаётся классом типов.
Тут явно противоречие с тем, что классы типов — есть специальное знание о типе. Более того, они задают не range оf types, а "several different types (which may not exhibit a common structure) and may behave in unrelated ways for each type.". А это ad-hoc.

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

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

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

V>

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

Мне это действительно непонятно. Распарсил лишь "а не значения". Знаешь что написано в английском варианте на соответствующем месте? Там ничего нет. Предложение перед тем, которое ты процитировал есть, а такого — нет. Т.е. это не перевод, это чья-то самодеятельность. Я бы не стал доверять этому источнику.

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

С этим я соглашусь. Но классы типов — это знание о типе, это ограничение. Значит, не PP. И хаскельвики говорит что классы признак — AH.

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


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

V>

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

V>В отличие от Вики, оно дано для программистов, поэтому выглядит кратко.
Выглядит кратко, но не имеет ничего общего (кроме наименования терминов) со Стрэчи, Карделли, Пирсом всех, кто ссылается на Стрэчи. Дает отличную от их определений классификацию через допущение явной или неявной информации о типе (словаре, констрэйнте и т.п). В этом и проблема. Прежде, чем использовать СВОЁ определение, хорошо бы было показать его эквивалентность с другими формулировками. Ты же просто сказал что "это мое", и все. А как же старина Декарт?

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

Не нашел. Подразумевая BPP под "типизированным ПП" вангую: не разновидность. Это сужение термина PP через ослабление требований определения. См. ограниченную квантификацию.

V>Или какое из слов/фраз тебе не понятно?

V>Слово "параметризуется" понятно?
V>Выражение "явно или неявно" — понятно? Или нужны примеры?
V>"Аргумент-тип" понятно или вызывает трудности?
Слова понятны. Неочевидна эквивалентность, точнее, очевидна неэквивалентность.
Или доказывай эквивалентность, или убеждай, что твое лучше, чем у других.

V>Потому что ты уже бредишь, если утверждаешь, что моё определение не подразумевает "вне зависимости от их типа".

Я такого не утверждаю. Это утверждает само твое определение. Если в нем нет упоминания зависимости от типа, значит оно эту зависимость никак не регулирует, а значит, допускает.
V>Наоборот, моё определение как раз предполагает одно и то же тело функции для МНОГИХ (более одного) типов аргумента.
Рад за тебя. Но значения обрабатываются таки по-разному в зависимости от типа, или одинакого, без каких либо знаний о типе?

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

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

V>В дестад, ясельную группу.

V>Ты уже по-русски технические тексты не понимаешь. ))
Тут больше сказать, я вообще не понимаю, что такое "поведение типа". Да и вообще сомнения вызывает то, к типу ли имеет отношение слово "поведение". А если не к типу, то к чему? Объясни, плиз, если тебе все понятно...
Может быть это отсыл к тому, является ли экземпляр значением или его можно использоваать как функцию?

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


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

Для одного конкретного типа, вызовется операция для этого конкретного типа. Для другого — другая (возможно). Зависимость работы метода от работы конкретной операции для конкретного типа очевидна. Или другими словами, без знания о конкретном типе нельзя выполнить операцию, соответствующую ему. Обращение к ней в тексте написать можно, верно. Но выполнить — нет.

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


V>Или от группы типов, Ы-Ы-Ы.

V>Видишь, как ты плаваешь в самих основах? ))
Не вижу

V>Ты не понимаешь самих основ даже банального ООП (не то, что ФП).

V>ты не понимаешь сути интерфейсов-конйептов, не понимаешь роли абстрактных классов.
V>Ты не понимаешь принцип подстановки Лисков.
Позволь увидеть основания для твоих выводов?

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

V>

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

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

Ну и жесть. Действительно, мое понимание абстрактного типа данных в значительной мере отличается от того, что ты процитировал. И гораздо ближе к английской вики
[/q]
In computer science, an abstract data type (ADT) is a mathematical model for data types where a data type is defined by its behavior (semantics) from the point of view of a user of the data, specifically in terms of possible values, possible operations on data of this type, and the behavior of these operations. This contrasts with data structures, which are concrete representations of data, and are the point of view of an implementer, not a user.

Formally, an ADT may be defined as a "class of objects whose logical behavior is defined by a set of values and a set of operations";[1] this is analogous to an algebraic structure in mathematics.
...
ADTs are a theoretical concept in computer science, used in the design and analysis of algorithms, data structures, and software systems, and do not correspond to specific features of computer languages—mainstream computer languages do not directly support formally specified ADTs.
[/q]
Если коротко и по-своему, то ADT — межъязыковая универсальная математическая концепт-модель, описывающая свойства и семантику операций над неким типом данных. По сути своей абстракции ADT недалек от абстрактного исполнителя некого языка, или абстрактного языка "очень высокого уровня", похожего на Pascal. Вместо русской вики почитай лучше https://en.wikipedia.org/wiki/Abstract_data_type
Или лучше саму http://web.cs.iastate.edu/~hridesh/teaching/362/07/01/papers/p50-liskov.pdf
Заодно посмотришь на язык "очень высокого уровня" и пример определения ADT. Жду твоих комментариев.

V>Вот. Теперь ты показал, что загвоздка у тебя была вовсе не в ad hoc и не в параметрическом полиморфизме.

V>У тебя сложности с самыми базовыми вещами — абстрагированием, как идиомы разработки ПО. ))
Я думаю, ты не догадываешься, сколько я этого абстрагирования на языке "очень высокого уровня" по Liskov наелся в ВУЗ-е и не только.

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

Да нет же, понимаю. С чего ты взял, что не понимаю? Только с того, что я утверждаю что это не ПП?
V>(Паттерн "Шаблонный метод" — основа ВСЕХ поведенческих паттернов из GoF)
Верно. Но ПП-то там откуда? Может быть об этом в GoF написано? Или Карделли упомянул? Пирс? Да ладно?


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


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

V>"тип объекта удовлетворяет заданным требованиям поведения" означает ограничение/типизацию аргумента полиморфной ф-ии или нет?
Спроси автора этой галиматьи. Я не берусь это комментировать. В английской вики такого нет.

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

А ну да, процитированный тобой отрывок бреда смотри, а примеры не смотри.

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

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

V>Вопрос. По твоей "собственной" классификации, вот по твоему чутью, выражение вида:

V>
V>   case p of
V>        A x => ...
V>      | B (x,y) => ...
V>      | C => ...
V>

V>это уже ad hoc или еще нет?
Нет. Ничто не указывает на специальные действия над экземплярами 'a. Если, конечно, ты не спрятал их за многоточиями.


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


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

V>

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

Откуда это взято можешь сообщить? Ты взял с русской вики. А там откуда? С чем оно вообще коррелирует? На английской странице ничего подобного про поведение типа нет, но есть ссылка на TAPL.

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


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


V>Смотрим пример по ссылке:

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

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

V>
V>length :: List a -> Integer
V>

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

V>Для пущего понимания дополню, что типы-суммы в Хаскеле — это всегда ссылочный тип!

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

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

V>

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

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

Не готов с тобой обсуждать это.

V>К чему я это?

V>Что "типы без ограничений" в хаскеле тоже есть — те самые «экзистенциалы».
Типы без ограничений есть — согласен.
V>Вот материал "для чайников" в попытыке отделить мух от котлет:
V>https://habrahabr.ru/post/207126/
С АТД я более-менее знаком, за ссылку все равно спасибо. Покурю.

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

V>

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

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

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

V>Итого, Nil и Cons — это функции.
Переписать можем, матчить — уже нет. Но можем доопределить функции, я не против.


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

V>

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

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

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

да

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

Допустим

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

Хорошо. Что это нам дало?

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

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

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

В английской нет ничего подобного.

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

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

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

V>Как же так, а?
Это твое процитированное определение вообще ни с чем не вяжется.

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

V>>>

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

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

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

V>Верно. Это работа Карделли на русском.

Это халтура, а не работа Карделли на русском.
V>Это была историческая справка появления термина "параметрический полиморфизм". Зачем? Потому что в следующей главе затем он вводит понятие "нетипизированного лямбда исчисления" и доопределяет параметрический полиморфизм до типизированного варианта и нетипизированного.
Я не вижу там доопределения, глава 2 вообще не содержит упоминания "parametric". Можно цитату, хоть на русском?

V>Типизированный вариант — это типа генериков дотнета или класса типов в Хаскель, т.е. ПП в ограничениях.

Да.

V>Нетипизированный — это "шаблонные ф-ии", т.е. генераторы кода.

Согласен.

V>На русском — ну чтобы сложностей не возникало.

V>Карделли не ставил себе задачу переопределить/оспорить формулировку ПП, он исследовал полиморфизм в различных языках.
V>За ПП он оставил исходное понятие из ML.
Исходное, надеюсь, было без ограничений?


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


V>О! Уже и на русском сложности. ))

V>А я даже жирным выделил, чтобы лучше видно было.
V>Карделли описал этот ПП в ML.
Ах он нуб!
V>Описал вполне однозначно — через частичное определение типов.
Давай так. Он ввел bounded quantification, который на подмножествах типов (определенных отношением subtype или included) ведет себя КАК ПП на неограниченном множестве. С оговоркой, что bounded может определять разное поведение при подстановке разных типов, а ПП — uniform.
Другими словами — установил подобие между параметрическим типом и супертипом, обеспечил универсальную модель для ПП и sybtypeP, научился выводить опущенные типы и супертипы.
Но нигде не написано что BPP это PP.

V>В Хаскеле, наследнике ML, их называют классами типов или обобщенными типами данных.

Верно. И они ad hoc.

V>Квантора всеобщности, на котором ты настаиваешь, разумеется нет.

Разумеется.
V>Есть квантор принадлежности. Оттуда же:
V>

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

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

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

V>

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

А ты его нубом назвал...

V>>>Или когда в Хаскеле пишешь equal_to :: (Eq a) => ... — ты частично определяешь тип a.

S>>Тоже. Но чистый PP не допускает специальных операций над экземпляром типа.

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

Хорошо, просто ПП, незамутненный ограничениями.

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

Можно ссылку или цитату хоть на русском?
V>Т.е., именно параметрический полиморфизм в ограничениях называется "истинным полиморфизмом".
Русская вики содержит ровно одно упоминание букв "истинн". И оно в этой фразе:

Параметрический полиморфизм является истинной формой полиморфизма[3]

Так что, не знаю, чему именно соответствуют твои знания об истинности ПП в ограничениях.

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

Не понял. Можно пример?

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


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

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

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

Меня мало трогает, что сначала, а что потом.

V>Ну я-то по профильной специальности в ВУЗ-е учился и даже был круглым отличником с повышенной стипендией. ))

V>Хотя, косил безбожно все лекции и практики, появляясь на занятиях пару раз в неделю (некогда было — спортом занимался).
Вот оно чо! И представлял ВУЗ на соревнованиях, да?

V>Мне быстрее прочитать и разобраться самому.

V>Ты так не можешь, как я погляжу.
Да уж куда уж...

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