Здравствуйте, vdimas, Вы писали:
_>>Это естественно без проблем записывается и через enable_if, но гораздо менее удобно. ) V>ИМХО, enable_if более "чиста" с т.з. системы типов. V>Т.е. мы сразу вычеркиваем неподходящее тело ф-ии целиком, а не пытаемся "отключить" невалидную часть тела ф-ии. Потому что этот фокус режет глаз... С другой стороны, ХЗ, может дело привычки...
Думаю, что тут зависит от того, какую часть тела функции занимает вариативная часть. Если имеется существенная невариативная часть, то if constexpr позволит избежать лишней копипасты.
Кстати, в библиотеки алгоритмов D static if частенько используется для оптимизации. Типа есть универсальная версия алгоритма для диапазона с последовательным доступом и местами её ускорение, если переданный диапазон поддерживает произвольный доступ.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, samius, Вы писали:
S>>Но ты погляди, они приведение типов классифицируют как ad-hoс,
V>Я уже писал: V>
V>И вики тоже с Карделли НЕ согласна, хотя приводит его классификацию (в кач-ве сугубо ознакомительной информации, вестимо).
мало ли. Я тебе просто напоминаю.
S>>однако при этом пишут "Действительно, ad hoc полиморфизм не является истинным полиморфизмом"
V>Является прямо по определению полиморфизма.
Но здесь же об "истинном" говорится. V>Тут Карделли показал, что он нуб, заплутал малость.
Очень тонкий и глубокомысленный аргумент.
S>>Какое совпадение! Перегруженные функции тоже не знают о том, что компилятор вызываает каждую из них как мономорфную.
V>И напротив, в случае автоматического приведения типов аргумента у нас всегда остаётся одна и та же ф-ия, а не множество их, т.е. зависимости от типа аргумента нет. Т.е., нет полиморфизма прямо по определению.
Прямо по определению откуда? У Карделли есть полиморфизм типа. У Пирса полиморфизм куска кода.
S>>Кстати, вот это твое выделенное определение полиморфизма полностью исключает ad-hoc, т.к. перегруженные функции формально разные, просто у них имя совпадает, да? Ну т.е. фиговое у тебя определение.
V>Перегруженные ф-ии — это формально несколько версий одной и той же ф-ии под разные типы аргумента. V>Потому что у тебя нет никакого другого способа отличить одну версию от другой, кроме как через тип аргумента. V>Что и требуется для полиморфизма.
И опять вики с тобой не согласна.
S>>В широком понимании полиморфизма (не полиморфизма функции) — полиморфизм есть.
V>В "широком" — это не в IT-области? )) V>Полиморфизмом еще называют "нечто", скажем в Физике и Химии, что может иметь разные св-ва, будучи при этом "одним и тем же".
Да нет, в IT.
V>В случае приведения типов у нас будут одни и те же св-ва, так как функция одна и та же.
Но типы разные
S>>Все верно, но это не единственная возможность проявления ad hoc. Или Стрэчи где-то написал обратное?
V>Стрэчи ввел сам термин "ad hoc полиморфизм", поэтому я отдаю право толкования этого термина ему.
Ну хоть что-то ты ему дал.
V>Единственно что — я могу лишь уточнять, что в конкретном случае является собственно полиморфизмом, а что нет, согласно вот той ссылке на книгу по теории типов.
Она уже написана, или еще редактируется?
V>А так-то да, из начального термина обособился мем "ad hoc" и стал довольно-таки популярным даже без связи с "полиморфизмом". Но я и на это уже обращал твоё внимание, что речь тут идёт о разновидностях полиморфизма, а не о сленге среди программеров.
дада.
V>>>Ну вот выше цитата по твоей ссылке. S>>И?
V>И то, что твоё словесное описание содержащегося по ссылке не сходится с её фактическим содержимым.
Уже лень смотреть.
V>>>В общем, тебе или стоит показать, что именно привело тебя к такому выводу: V>>>"ограничение типа аргумента классом типа — есть ad-hoc полиморфизм". S>>Не знаю, где ты взял, может быть я так и выразился.
V>Это твоя точная цитата, ты дважды просил меня опровергнуть именно такую твою формулировку.
Пусть так.
S>>Но само ограничение — не есть полиморфизм.
V>Бинго! ))
S>>Но является признаком его.
V>Оно является классикой жанра — необходимым, но недостаточным условием.
Достаточным, но не необходимым. V>Да и "необходимым" оно является лишь в системе, позволяющей только "типизированный параметрический полиморфизм".
Я так и не нашел, что это такое.
V>А так-то многие примеры из мира Хаскеля откровенно глупы, увы.
Еще один тонкий аргумент. V>Например, часто противопоставляют ф-ии с ограничениями ф-иям без ограничений. Якобы. Потому что часто авторы таких "противопоставлений" пихают пример работы со списком как якобы пример без ограничений. Какой кошмар. )) Список — это уже готовый концепт, это некий класс типов List и связанные с ним определения и ф-ии.
Если ты имеешь в виду Foldable t, то все верно. elem ad-hoc полиморфна и по нему тоже. Но если бы она писалась в точности для списка, то была бы ad-hoc полиморфна по a.
S>>Ограничение указывает на наличие специального поведения для некого типа.
V>Ограничение указывает на обобщённый код, в котором будет использоваться типизированный концепт. V>То бишь, ограничение — это ВСЕГДА параметрический полиморфизм. V>Что в C#, что в Хаскеле.
Ты говоришь о bounded parametric polymorphism, который не одно и тоже что и параметрический полиморфизм. Кстати, если верить вики, то ввел его именно нуб Карделли вместе с Wegner-ом.
S>>А специальное поведение — признак ad-hoc.
V>Да я сразу понял ход твоих рассуждений. V>Поэтому сразу же привел все признаки ad hoc полиморфизма. V>Нужны все сразу. По одному эти признаки не канают.))
Ты можешь приводить что угодно, но если это расходится с определениями, то невелика цена твоим приведениям.
S>>Вообще, универсальным образом (не зная ничего о типе) можно сделать довольно немного вещей. Отобразнить сам в себя, положить в коробку, достать из коробки (кстати, это не касается C++).
V>Положить в коробку без ограничений нельзя. V>Работает "структурный полиморфизм", однако.
Однако, ты только что утверждал что полиморфизм один и он о функциях. Уже переобулся?
S>>Ну и там найти длину списка.
V>Найти длину списка без ограничений тоже нельзя. Работает параметрический полиморфизм.
И какие тебе нужны ограничения для нахождения длины списка? Но да, действительно параметрический (что значит, без ограничений).
S>>Все остальное (математические операции, сравнение и т.п.) требует специального знания о типе. Разве это не очевидно?
V>Твои рассуждения очевидны. V>Но беспощадность спора была обоснованной — спор-то терминологический. ))
В чем же беспощадность заключается? В твоем беспощадном назывании Карделли нубом?
V>>>Неужели сам не увидел, что из твоей формулировки получается бредовое следствие, а именно — объявление любой мономорфной ф-ии точно так же "есть ad hoc полиморфизм". S>>Ну, во-первых, не моей. Ты можешь прочитать об этом в той же русской вики. Во-вторых — да, для слаботипизированных языков мономорфные функции позволяют демонстрировать ad-hoc полиморфизм через приведение типа.
V>Для Хаскеля определение обобщенной ф-ии в ограничениях и мономорфной отличается не сильно. V>Поэтому, даже вот без этого приведения типов, получается так, что если в Хаскеле определили некую мономорфную ф-ию — то обязательно получаем ad hoс полиморфизм? ))
Ты назвал Хаскель слаботипизированным?
S>>И да, он не настоящий, не истинный. Истинным называется параметрический.
V>Неправда, потому что формальные признаки классификации на это НЕ указывают. V>В этом смысле писанина Карделли ничем не лучше праздных обсуждений на этом сайте. V>Просто чел имеет мнение, но его постоянно поправляют. ))
Кто кроме тебя?
S>>Точную цитату Стрэчи, я, конечно, не дам. Не смог найти его лекции. Но вот все, кто на него ссылаются, трактуют его единым образом. Возьми, хотя бы русскую вики.
V>ОК, давай трактовку.
Тем не менее, определение специальных реализаций функций для разных типов в некоторых случаях является необходимостью, а не случайностью. Классическими примерами служат реализация арифметических операций (физически различная для целых и чисел с плавающей запятой) и равенства типов[en], которые на протяжении десятилетий не имели общепринятой универсальной формализации. Решением стали классы типов>>>, представляющие собой механизм явного дискретного перечисления допустимых значений переменных типа для статической диспетчеризации в слое типов. Они сводят воедино две разновидности полиморфизма, разделённые Стречи, «делая ad hoc полиморфизм менее ad hoc»[12] (игра на двойственности смысла).
V>Потому что последние 20 лет я видел тоже вполне однозначное толкование ad hoc полиморфизма и был малость удивлён, встретившись с твоей интерпретацией.
Остается догадываться, куда ты смотрел последние 20 лет... Эта трактовка используется Wadler-ом, который предложил классы типов примерно 30 лет назад.
S>>Ты так и не привел классификации, которую используешь сам.
V>Привел не раз. V>Причем, местами совсем уж не раз. ))
ты, видимо, в какой-то параллельной реальности существуешь.
S>>Ни разу. Вот конкретно по этому вопросу. Нет нужды искать за годы.
V>Ну вот в каждом сообщении в этом споре, постоянно повторяя себя.
И в этом тоже?
V>>>Тю, так это не наезд, а в трех соснах заблудился, что ле? S>>Так что ты называешь соснами?
V>Это противоположное рокет-саенсу.
S>>Ты вот не плутаешь, а классификацию так и не привел.
V>Я приводил определения как параметрического, так и ad hoc полиморфизма. V>Приводил их многократно.
То что ты приводил — какая-то отсебятина. Я просил сослаться на что-нибудь, что являлось бы для тебя авторитетным источником определений параметрического и ad-hoc полиморфизмов. Но единственное, на что ты сослался — книга, в которых нет упоминаний ни того, ни другого.
V>Вот даже в этом сообщении, на которое ты отвечаешь — минимум дважды было сказано что есть полиморфизм вообще и что есть ad hoc полиморфизм.
Я же говорю, отсебятина.
V>Я даже писал многократно, что полиморфизм обобщённого вида на ограничениях — это исключительно признак параметрического полиморфизма, причем именно "типизированного параметрического полиморфизма". Что есть типизированный и нетипизированный ПП — тоже уже пояснял.
ты что ли о bounded PP? Это не то же самое что PP.
S>>Ты отвечал вот на это "Но найди мне источник, где бы говорилось что ограничение типа аргумента классом типа — есть не ad-hoc, а параметрический." и промахнулся.
V>Так я тебе сразу дал хорошую ссылку: "типизированный параметрический полиморфизм", "концепт". V>Эта вся ссылка. Причем, по состоянию Интернета на 2017-й год — исчерпывающая.
У меня, походу, интернет не той системы. Дает ссылки на лурк, ЛОР, ixbt. Там твои авторитеты живут?
V>По крайней мере в тех работах, в которых говорится о типизированном параметрическом полиморфизме, ОБЯЗАТЕЛЬНО будет присутствовать "ограничение" типа-аргумента тем или иным способом. Потому что это не "ограничение" нифига (корявая терминология дотнета), а именно что "типизация" концепта.
В работах по bounded PP действительно используются ограничения. Но мы то говорим о PP vs ad-hoc. Я, во всяком случае.
S>>О, значит у тебя своеобразное понимание Стрэчи.
V>Ты уже второе сообщение подряд жилишь, спекулируешь, устраиваешь словесный бесполезный пинг-понг. V>В отличие от такого бестолкового времяпрепровождения я скопировал в сообщение, на которое ты отвечаешь, определения самого Стэчи. Изволь отвечать по процитированному, или давай свои цитаты или переставай паясничать.
Я не нашел цитату в этом сообщении.
V>Возможно, ты их не понимаешь или они тебе просто "неудобны". V>Так бывает. V>Особенно когда нечем опровергнуть.
Ну как нечем. Кардели, Пирс, вики та, вики ся.
V>>>Привел неоднократно. S>>Так где же в твоей классификации место приведению типов?
V>А нету. V>Потому что не относится к полиморфизму по определению полиморфизма.
По определению полиморфной функции — естественно. А у нуба Карделли есть определение полиморфного типа.
V>>>Приведение типа является разновидностью ad hoc полиморфизма только по версии Карделли (по твоей же ссылке). S>>Ну как? А вики?
V>Вики рассказывает о разных версиях, упоминает версию Карделли. V>Что не так? V>До тех пор, пока Вики не говорит "от своего лица" с неё взятки гладки.
Ну а что в отношении тебя, когда ты от лица всего полиморфизма тут ответственно заявляешь?
V>>>Стрэтч такого не задвигал. S>>Пруф
V>Пруф что не задвигал?
Угу V>Если бы мы обменивались остротами, было бы смешно.
А я не смеюсь, я удивляюсь, откуда ты знаешь, что он не задвигал? Или ты тут уже и от его лица тоже вещаешь?
V>>>И вики тоже с Карделли НЕ согласна, хотя приводит его классификацию (в кач-ве сугубо ознакомительной информации, вестимо). S>>Не согласна?
V>Конечно не согласна. )) V>Когда согласна, пишет от первого лица.
Без упоминания автора, что ли?
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, samius, Вы писали:
V>>>
V>>>A polymorphic function is one which takes a type as one of its arguments ...
S>>Съезжаешь?
V>Откуда куда?
Я же пояснил, а ты разбил.
S>>Ты говоришь что формулировка определяет полиморфизм, но она определяет полиморфную функцию. Давай для начала определимся... "Polymorphic function" — Это полиморфизм, или полиморфная функция?
V>Это полиморфизм и есть. Он один в IT, других не завезли.
Увы, завезли. Просто ты не считаешь за IT то, что расходится с твоим пониманием.
V>Всегда, когда речь идёт о полиморфизме, речь идёт про полиморфные ф-ии.
Вот задвинул, так задвинул!
V>Барбара Лисков так же рассмотрела кортежи таких функций и принципы подстановки этих кортежей.
Молодец Барбара.
S>>Жаль, твоя наиболее полная классификация не содержит указаний по отделению ad-hoc от параметрического.
V>Потому что это несущественно.
А чего ты мне тут втираешь свое понимание несущественных вещей от лица всего полиморфизма?
V>>>Некоторые же виденные неоднократно классификации внутри параметрического полиморфизма 1-го ранга не обладают вообще никакой полнотой и более того — практической ценности подобные "знания" не дают. Тем более, повторюсь, что порой противоречат друг другу. S>>Я что-то уже забыл. Что там противоречило?
V>Авторы классификаций вводят каждый свою терминологию. Разные термины под одно и то же — противоречие.
Ну так там твоя — еще одна "разная", или как? Или автор твоей классификации особенный?
S>>Может быть оно противоречит только при твоем толковании? V>Вопрос риторический? ))
верно
V>>>По-моему, я высказался вполне однозначно, что именно является мутным: "Некоторые авторы ... называют параметрический полиморфизм истинным полиморфизмом". Тем более, что здесь ты отвечал на абзац, где уже обсуждалась твоя вики-страница. S>>Ну да, называют параметрический истинным. Ты против?
V>Да, я против безграмотности. V>Я общался одно время с западными "специалистами" плотно, ничего удивительного, кароч... V>Нубство на нубстве.
Верно, это можно экстраполировать на всех, с кем ты общаешься. Ничего удивительного.
V>На самом деле там всё еще узколобее, кто задвигает подобное. V>"Они" (укушенные ML и Ко) называют истинным полиморфизмом только типизированный параметрический полиморфизм. Вот что бывает, когда в базовых знаниях дыра.
Какой ужас! А ты называешь ad-hoc параметрическим!
V>>>Что НЕ эквивалентно определению из данной мною книги. V>>>Согласно неё полиморфная ф-ия берет два аргумента на входе: S>>Так ты все-таки решил съехать через число аргументов? А зачем же соломку стелил?
V>Затем, что аргумент-значение — один. V>Другим аргументом идёт тип. V>И это важно.
Ок, пусть так
V>>>Этот Лука вообще отвергает ad hoc как разновидность полиморфизма, S>>Да не отвергает, а не рассматривает ее в пределах указанной тобой статьи.
V>Это самая известная его статья, кста.
А хаскельвики ссылается на другую. В одной не рассмотрел, в другой — рассмотрел. Никакого отвержения я не заметил.
V>>>в то время как согласно Hott — это несомненно разновидность полиморфизма. S>>Несомненно, вот только я упоминания термина не нашел.
V>Зачем тебе термин, если есть формальное определение полиморфизма? V>Я уже скоро начну явзить в таких ситуациях, бо давно уже не смешно.
Дык я уже начал.
V>Прежде чем вообще спорить о том, какой вид полиморфизма получается в том или ином случае, было бы неплохо для начала убедиться, что мы имеем дело именно с полиморфизмом, не? И вот эту простую мысль я до тебя никак не могу донести. Жесть и пипец.
Да мысль-то тривиальная, но ты полиморфизм функции принимаешь за полиморфизм вообще, а полиморфизм типа или куска кода отрицаешь как класс. Хотя имеются определения. Но почему ты уперся в определение полиморфной функцией и называешь ее полиморфизмом — загадка. Риторическая.
V>>>Видишь как удобно оперировать классификациями, обладающими полнотой, супротив писанины некоих авторов, на которых молятся (непонятно с чего) хаскелисты. )) S>>Удобно оперировать тем, о чем не упомянуто в книге. Согласен.
V>Удобно жилить, игнорить аргументы, троллить и строить из себя не понимающего. V>В книге даны чудесные формальные определения.
Не менее чудесные в других источниках.
V>Ты признался, что ты их до сих пор НЕ понял.
Разве? V>Хотя после такого подробного обсуждения поняли уже студенты 1-го курса. )) V>ОК. V>Пусть так. V>Не выходит? — бывает. V>Не всем даётся.
Вижу, что не всем.
V>>>Моё предупреждение не сработало. Пичалька... S>>Сладко поешь. Но это ты не понял про ad hoc полиморфизм в хаскельвики. Это у тебя elem параметрически полиморфна. А в хаскельвики она ad-hoc.
V>Ф-ия elem именно что параметрически полиморфна.
В твоем понимании V>А вот ad hoc она полиморфна при этом или нет — зависит от того, есть ли конкурирующие её определения. V>Это азбучные вещи.
Ненене, про конкурирующие определения в определении ad-hoc ни слова. Ни в одном. V>Ты в них плаваешь. V>Не понимаешь нифига. V>Не можешь прочесть пяток слов по английски не потеряв смысла. V>Вот, уже наговариваешь на Хаскель вики.
Как это наговариваю? Ты ее хоть открыл? По хаскельвики elem ad-hoc, а length — PP. На ссылку. V>Ищешь виноватых. V>Кошмар...
Зачем мне виноватые?
Здравствуйте, samius, Вы писали:
S>>>однако при этом пишут "Действительно, ad hoc полиморфизм не является истинным полиморфизмом" V>>Является прямо по определению полиморфизма. S>Но здесь же об "истинном" говорится. V>>Тут Карделли показал, что он нуб, заплутал малость. S>Очень тонкий и глубокомысленный аргумент.
Ну и что ж ты сам аргумент скипнул, ы?
в случае автоматического приведения типов аргумента у нас всегда остаётся одна и та же ф-ия, а не множество их, т.е. зависимости от типа аргумента нет. Т.е., нет полиморфизма прямо по определению.
Половина оставшегося поста в этом же стиле — беспричинное нечистоплотное тролление...
Ладно, ты уже не первый раз в этом споре демонстрируешь странные замашки, сорри, выхожу.
Здравствуйте, samius, Вы писали:
S>>>Давай для начала определимся... "Polymorphic function" — Это полиморфизм, или полиморфная функция? V>>Это полиморфизм и есть. Он один в IT, других не завезли. S>Увы, завезли. Просто ты не считаешь за IT то, что расходится с твоим пониманием.
Увы, опять фейл. "Полиморфизм" относится исключительно к поведению, т.е. только к ф-ям и методам.
Причем, это понятие идентично что в ООП, что в ФП.
Не, я, конечно встречал от коллег "полиморфные типы данных" и даже ржал...
Отсюда вопрос:
Это полиморфизм, или полиморфная функция?
лишен смысла. Одно без другого не бывает.
V>>Всегда, когда речь идёт о полиморфизме, речь идёт про полиморфные ф-ии. S>Вот задвинул, так задвинул!
Сказал человек, который тут рассуждал о "просто полиморфизме" без функций и даже о "просто ad hoc" без "полиморфизма".
Дожились...
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, samius, Вы писали:
V>>>Не будет до тех пор, пока ограничения генериков не станут частью типа. S>>Что мешает?
V>Загадка, если честно. V>Должно было сразу же быть как надо. V>Причем, такие изменения можно сделать не ломая имеющийся код.
Я спросил о том, что же мешает компилятору указывать тип компарера пока "ограничения генериков не сделают частью типа".
S>>Так ты хотел именно конкурирующие специализации? Извини, из твоих постов я это не понял.
V>А к чему нужны точно так же как нужна перегрузка ф-ий. V>Без неё тяжело, верно. V>Тут аналогично — это просто перегрузка ф-ий по типу аргумента.
Ясно, т.е. не смертельно.
S>>А к чему они нужны, что они доказывают?
V>Странно ты вопросы формулируешь. )) V>Наверно они доказывали бы наличие головы у авторов языка.
Вижу, тема наличия головы у авторов C# тебе ближе и интереснее.
S>>Верно, нет. Но если бы было возможно, это был бы ad-hoc.
V>Да. Это был бы ad hoc сверху параметрического полиморфизма, как в любом современном языке с поддержкой типизированного параметрического полиморфизма. На то она и типизированность, чтобы отличать типы друг от друга.
Опять плавание в определениях
S>>Вот зачем ты мне рассказываешь про каких-то горе-обвинителей? Они не смогли оценить твою победу над ними и ты хочешь что бы я сделал это за них?
V>Сама эта ветка родилась по результату сравнения св-в параметрического полиморфизма в С++ и дотнете. V>И мне только в том сообщении, на которое ты отвечаешь, похоже, удалось донести — что не так-то в дотнетном варианте... )) V>Тяжело... ))
Так ведь не удалось. Параметрический полиморфизм не требует ограничений и спецкода для конкретных типов. И в C# List<T> ничего не требует от T, как тго std::vector<T> требует от T.
V>>>Так я там и показал совместную работу двух видов полиморфизма — я продемонстрировал, как породить специализацию для ограниченного семейства типов из изначально неограниченного. А чтобы было понятней — я сделал это ограничение аккурат на манер дотнета, а именно — указал в кач-ве ограничения базовый класс. S>>Дотнет тоже умеет использовать ad-hoc.
V>Только в монотипах. И это удобно, ес-но. V>Более того, работает вариативность/ковариативность. V>Хотелось бы в параметрически-зависимых ф-иях тоже и тоже с учётом правил вариативности.
Полагаю, что твои хотелки не являются определяющими в вопросе ad-hoc/PP.
V>>>Так-то в С++ можно придумать овердохрена способов всевозможнейших ограничений. V>>>См. type traits и function traits. S>>Ну можно.
V>Ну. В C# — нельзя.
V>Это я к тому, что в отличие от С++, в случае дотнета в сам язык/платформу надо включать много чего, для повышения выразительности. V>Например, см. идиому С++ enable_if — она работает сугубо за счёт уже имеющихся ср-в языка.
Аналогично.
V>>>Потому что нельзя породить несколько версий List<T> с разными ограничениями на T. Или в одном List<T> нельзя давать методы с разными ограничениями на T. S>>А ЗАЧЕМ?
V>Зачем типизировать T? )) V>Да еще статически-типизированном языке?
V>Странные ты опять вопросы задаешь... V>Затем, вестимо, чтобы не происходило стирание типов. Чтобы больше сценариев удавалось разресолвить в момент компиляции, без всяких рефлексий и кодогенераций. Помнишь, в эпоху до генериков народ упражнялся в автогенерации "типизированных коллекций"? Или ты не застал эти времена?
Времена застал, но упражнения пропустил. Т.е. внятного ответа на вопрос ЗАЧЕМ не будет. Ок, пропускаем.
V>>>Курьёз в том и состоит, что как пример ad hoc-полиморфизма ты мне приводил в Хаскеле как раз те примеры, где ограничение на тип является частью полиморфного типа. S>>Какая разница? elem — ad hoc. IndexOf — ad hoc. Что именно меняет то, на что ты упираешь?
V>Дудки. Твой IndexOf не в состоянии быть ad hoc, потому что ты не можешь подать на него разные обобщенные типы.
Чего? Разные обобщенные нужны параметрическому. ad hoc работает с ограниченным набором. V>И да, обе ф-ии параметрически полиморфны, сначала. А потом уже, в случае Хаскеля, возможен ad hoc. Потому что elem определена не только для обобщенных типов, но и для монотипов — для пустого списка, например.
Я полагаю что "пустой список" это не тип, а data constructor
V>>>Т.е., курьёз у тебя происходит классический: тут смотрим, тут не смотрим, тут рыбу заворачиваем. )) S>>И там и там смотрим — видим ad-hoc. Рыба у тебя какая-то с параметрическим elem.
V>Верно. Среди нескольких (ровно двух) ad hoc определений elem есть вариант параметрически-полиморфного определения. V>И можно добавлять свои параметрически-полиморфные определения для, скажем, неких своих моделей списков. V>Оно так и должно работать.
Под разными определениями, надо полагать, ты подразумеваешь разные паттерны паттерн-матчинга, которые друг без друга дают on-exhaustive patterns? Остроумно.
S>>Детсад — это утверждение что система типов каким-то образом влияет на то, ad hoc или нет.
V>Детсад — что-то утверждать за оппонента.
Извини. Но если ты считаешь что не влияет, то к чему твой аргумент? Просто поболтать?
S>>Покажи, откуда это вообще следует?
V>Покажи сие странное утверждение.
В Хаскеле для ad hoc полиморфизма тебе потребовалось ограничение внести в систему типов, в C# уже не требуется, "это всё равно ad-hoc".
Если ты не утвеждаешь, а просто мелешь, то ничего более не требуется. Видимо, в ML ad hoc вообще не было...
V>>>В случае обеих языков ad hoc происходит не там. S>>нене, языки тут не при чем. Это в твоей голове ad hoc происходит не там.
V>Ясно. V>За своей головой лучше бы посмотрел.
V>Потому что потом вообще идёт жесть и закономерный финал:
V>>>А зря. По всей этой ветке это был тот самый единственный, который необходимый и достаточный аргумент, дающий исчерпывающий мой поинт относительно проблем параметрического полиморфизма в C#. S>>Мы пока еще не договорились по поводу того, что считать параметрическим.
V>ЧТД. Ниасилил? Бывает. ))
А что, разве договорились? Покажи, где именно.
Здравствуйте, alex_public, Вы писали:
_>Здравствуйте, samius, Вы писали:
S>>Хы, пропустил я как-то момент, когда студенты начали изучать принципы устройства ЦПУ c реализации каррирования в GHC.
_>Ты похоже уже забыл, что я тебе уже писал. Для того, чтобы посмеяться над идеей каррирования в машинных кодах не надо ничего знать про какие-то реализации Хаскеля и т.п. Это смешно само по себе, если знать устройство современных процессоров (попробуй просто представить себе что потребуется сгенерировать компилятору и как будет выглядеть вызов всего этого скажем в случае функции 5-и переменных). И то, что ты по прежнему этого не понимаешь, прямо поражает. Ты вообще в курсе таких вещей как аппаратный стек, пролог и эпилог функции и т.п. базовые вещи, знакомые каждому студенту? )
Базовые вещи, которые должны быть знакомы каждому студенту, не вылетевшему в первый год — это кванторы. Вышка у нас входит в программу-минимум высшего образования даже для политологов. Тут у тебя опять использован квантор, хотя мне известно не так много специальностей, где бы читали про аппаратный стек, пролог и эпилог функции. Я думаю что оно весьма и весьма ограничено. Так, что ты снова демонстрируешь пробелы с пониманием кванторов.
S>>Да и похоже что сам Стрэчи, введя классификацию в 1967м году выглядел бы жалко и убого. Он, бедолага, и Хаскеля-то не видел. Как он вообще мог, не зная частной реализации каррирования в машинных кодах, вводить такие классификации!!!
_>The name "currying", coined by Christopher Strachey in 1967, is a reference to logician Haskell Curry.
Рад, что ты это находишь смешным.
S>>Тебе надо было листать не мое сообщение, а спецификацию C++. Я вроде бы недвусмысленно указал на это. Да ладно уж.
_>Ну т.е. ты так и не можешь представить своё определение понятия "поведение функции"? Хотя при этом говоришь что все его понимают одинаковым образом (так каким же тогда?)...
А для чего мне представлять именно свое определение? Свое понимание (и не только мое) этого вопроса — я уже излагал. Указывал, где посмотреть на специфику для C++. Мало? Извини, определения поведения функции в аппаратных стеках у меня нема.
_>>>В прошлом ты пытался выкрутиться из этого противоречия в своём мировоззрение с помощью утверждения, что "apply f" — это уже совсем другая функция с другими свойствами. Когда же ты открыл для себя, что в реальности используется всё та же apply, то начал придумывать новые отмазки, что мол для ФВП надо делать исключения и определять их по другому. Так что конкретно ты имеешь в виду под "своим мнением"? В этом потоке судорожных попыток как-то замять противоречивость никакой чёткой и однозначной позиции я так и не увидел. S>>Мне жаль.
_>Ну т.е. и насчёт противоречия с apply тебе сказать нечего? ) Что-то ты совсем сдулся как оппонент. )
Я тебе уже сказал. Хочешь повторить — отмотай назад.
S>>Я уже перчислял, чему противоречат твои взгляды. Возможно, тебе стоило бы озадачитьься этим, а не искать противоречие в моих.
_>И тут тебе сказать нечего. В общем всё понятно.
Понятно что ты спецификацию не откроешь и про поведение программы не прочитаешь.
_>>>Ничего общего с твоим бредом тут нет. Операторов равенства для разных типов много — это и есть ad hoc. А оператор равенства для eq ровно один. S>>функция S>>myEq a b = a == b S>>тоже одна. И она ad-hoc.
_>Глупости какие. Если убрать библиотечный сахар (реализуемый через МП) в C++ варианте и синтаксический сахар (посмотреть на внутреннюю реализацию классов типов) Хаскеля, то легко увидеть, что в обоих вариантах эти функции в реальности выглядят как-то так: _>
_>а значение f автоматически подставляется компилятором (по определению работы Хаскеля/по МП коду в конструкторе eq в варианте C++) в точках вызова my_equal_to в соответствие с передаваемыми там типами. Никакого принципиального отличия от обсуждаемой тут apply эти реализации не имеют. Но при этом они у тебя ad hoc полиморфные, а apply параметрически полиморфная.
Видишь, реализации! А в терминах поведения они существенно отличаются. apply ведет себя неотличимо от любой (здесь я использовал квантор всеобщности, если ты когда-нибудь с ними таки ознакомишься) функцции f. А my_equal_to ведет себя неотличимо от eq для каждого типа, для которого определен eq. А значит, специальнымм образом на ограниченном наборе. Но ты гляди в аппаратный стек, что бы не ошибиться. Оттуда, наверное, вообще все функции полиморфными кажутся
Здравствуйте, 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 — я уже много раз тебе писал. Медитировать до просветления, как грится.
После тебя
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, samius, Вы писали:
V>>>Тут Карделли показал, что он нуб, заплутал малость. S>>Очень тонкий и глубокомысленный аргумент.
V>Ну и что ж ты сам аргумент скипнул, ы? V>
V>в случае автоматического приведения типов аргумента у нас всегда остаётся одна и та же ф-ия, а не множество их, т.е. зависимости от типа аргумента нет. Т.е., нет полиморфизма прямо по определению.
Я неоднократно ответил. Отказываюсь считать определением полиморфизма определение полиморфной функции.
V>Половина оставшегося поста в этом же стиле — беспричинное нечистоплотное тролление... V>Ладно, ты уже не первый раз в этом споре демонстрируешь странные замашки, сорри, выхожу.
Кобыле легче
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, samius, Вы писали:
S>>>>Давай для начала определимся... "Polymorphic function" — Это полиморфизм, или полиморфная функция? V>>>Это полиморфизм и есть. Он один в IT, других не завезли. S>>Увы, завезли. Просто ты не считаешь за IT то, что расходится с твоим пониманием.
V>Увы, опять фейл. "Полиморфизм" относится исключительно к поведению, т.е. только к ф-ям и методам.
Опять вещание за всю Одессу
V>Причем, это понятие идентично что в ООП, что в ФП.
V>Не, я, конечно встречал от коллег "полиморфные типы данных" и даже ржал...
Это характеризует тебя, не коллег.
V>Отсюда вопрос: V>
V>Это полиморфизм, или полиморфная функция?
V>лишен смысла. Одно без другого не бывает.
Бывает. Открой уже Карделли или русскую вики.
V>>>Всегда, когда речь идёт о полиморфизме, речь идёт про полиморфные ф-ии. S>>Вот задвинул, так задвинул!
V>Сказал человек, который тут рассуждал о "просто полиморфизме" без функций и даже о "просто ad hoc" без "полиморфизма". V>Дожились...
Сказал человек, рассуждающий о полиморфизме, глядя на определение полиморфной функции.
Здравствуйте, samius, Вы писали:
V>>Увы, опять фейл. "Полиморфизм" относится исключительно к поведению, т.е. только к ф-ям и методам. S>Опять вещание за всю Одессу
Любая предметная область начинается с терминологии.
Ты нашей терминологией НЕ владеешь.
Тут не надо быть оракулом, чтобы предположить, что у тебя непрофильное образование.
V>>Не, я, конечно встречал от коллег "полиморфные типы данных" и даже ржал... S>Это характеризует тебя, не коллег.
Согласен, все могут ошибаться. Тут главное иметь желание учиться.
Но всё-равно, "полиморфные типы данных" — это ДЕЙСТВИТЕЛЬНО смешно.
Когда рассуждают о типах данных, то говорят об "абстрактных типах данных".
Да и вообще. Ты же одно время демонстрировал, что даже читал про т.н. "Паттерны проектирования".
Так вот, по обсуждаемой теме есть паттерн "Шаблонный метод". Не хочешь освежить?
Этот паттерн как раз показывает работу "истинного" (по Карделли) полиморфизма в ООП.
Более того, в этом паттерне полиморфизм даже означает именно что "физическое исполнение одного и того же кода", о как!
V>>Отсюда вопрос: V>>
V>>Это полиморфизм, или полиморфная функция?
V>>лишен смысла. Одно без другого не бывает. S>Бывает. Открой уже Карделли или русскую вики.
Открой свою совесть уже. ))
Нет ничего проще, чем давать конкретные цитаты, верно? Но у тебя это простое действо НЕ получается уже два десятка постов.
Саботаж. Троллинг. Пустозвонство.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, samius, Вы писали:
V>Любая предметная область начинается с терминологии. V>Ты нашей терминологией НЕ владеешь.
Ну да, ты же присвоил терминологию.
V>Тут не надо быть оракулом, чтобы предположить, что у тебя непрофильное образование.
По образованию я математик, специальность — компьютерная математика.
V>>>Не, я, конечно встречал от коллег "полиморфные типы данных" и даже ржал... S>>Это характеризует тебя, не коллег.
V>Согласен, все могут ошибаться. Тут главное иметь желание учиться. V>Но всё-равно, "полиморфные типы данных" — это ДЕЙСТВИТЕЛЬНО смешно. V>Когда рассуждают о типах данных, то говорят об "абстрактных типах данных".
Поучи нуба Карделли, как нужно говорить. Потом с тобой посмеюсь.
V>Да и вообще. Ты же одно время демонстрировал, что даже читал про т.н. "Паттерны проектирования".
V>Так вот, по обсуждаемой теме есть паттерн "Шаблонный метод". Не хочешь освежить? V>Этот паттерн как раз показывает работу "истинного" (по Карделли) полиморфизма в ООП.
Это кто сказал, Карделли?
Полиморфизм в ООП — это ad hoc рантайм диспетчеризация по неявному аргументу.
V>Более того, в этом паттерне полиморфизм даже означает именно что "физическое исполнение одного и того же кода", о как!
А знаешь, что означает слово "полиморфизм" в этой книге?
polymorphism
The ability to substitute objects of matching interface for one another
at run-time.
S>>Бывает. Открой уже Карделли или русскую вики.
V>Открой свою совесть уже. ))
V>Нет ничего проще, чем давать конкретные цитаты, верно? Но у тебя это простое действо НЕ получается уже два десятка постов. V>Саботаж. Троллинг. Пустозвонство.
Раз ты сказал волшебное слово "пожалуйста", то вот (http://lucacardelli.name/Papers/OnUnderstanding.A4.pdf)
Polymorphic types are types whose operations are applicable to values of more than one type.
Просто так не надежно, мало ли, я решу приколоться и подменю цитату. Вот если бы ты сам открыл... Хотя, я бы на твоем месте не доверял бы своим глазам и английскому даже в этом случае.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, samius, Вы писали:
S>>Я неоднократно ответил. Отказываюсь считать определением полиморфизма определение полиморфной функции.
V>Не останавливайся на достигнутом. Откажись считать себя программистом.
На том основании, что ты не распарсил слово "function" в определении, которое пытался выдать за определение полиморфизма? Это несерьезное основание.
Здравствуйте, 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>Ты жди, а по мне оно УЖЕ работает.
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>После тебя
Ну я-то по профильной специальности в ВУЗ-е учился и даже был круглым отличником с повышенной стипендией. ))
Хотя, косил безбожно все лекции и практики, появляясь на занятиях пару раз в неделю (некогда было — спортом занимался).
Мне быстрее прочитать и разобраться самому.
Ты так не можешь, как я погляжу.
Здравствуйте, samius, Вы писали:
V>>>>Не будет до тех пор, пока ограничения генериков не станут частью типа. S>>>Что мешает? V>>Загадка, если честно. V>>Должно было сразу же быть как надо. V>>Причем, такие изменения можно сделать не ломая имеющийся код. S>Я спросил о том, что же мешает компилятору указывать тип компарера пока "ограничения генериков не сделают частью типа".
Мешает непреодолимое стирание типа, что надо лезть в рефлексию.
V>>Тут аналогично — это просто перегрузка ф-ий по типу аргумента. S>Ясно, т.е. не смертельно.
Ес-но. Копипаста и вперёд. Раньше же жили как-то вообще без генериков и ничего.
S>>>А к чему они нужны, что они доказывают? V>>Странно ты вопросы формулируешь. )) V>>Наверно они доказывали бы наличие головы у авторов языка. S>Вижу, тема наличия головы у авторов C# тебе ближе и интереснее.
Здравствуйте, samius, Вы писали:
V>>Любая предметная область начинается с терминологии. V>>Ты нашей терминологией НЕ владеешь. S>Ну да, ты же присвоил терминологию.
Да. Я тут появился специально морочить тебе голову.
Ты в прошлой жизни за что-то провинился, вот теперь наказан. ))
V>>Тут не надо быть оракулом, чтобы предположить, что у тебя непрофильное образование. S>По образованию я математик, специальность — компьютерная математика.
Во-первых, я знаю эту специальность, у меня на ней племянница учится.
Там изучают больше вычислительные алгоритмы.
Статистика, тервер, по основам алгебры сурово гоняли (я ей помогал готовиться к экзаменам) и т.д. и т.п.
Мы это тоже изучали, ес-но, просто в чуть меньшем "погружении".
Зато другое изучали с чуть большим, ес-но.
Во-вторых, ты в любом случае должен знать эту пословицу:
Теория без практики мертва, практика без теории слепа.
Т.е. одно без другого не работает.
А ты что делаешь? — отказываешься рассматривать сами определения терминов и просишь меня растолковать исключительно примеры к ним.
Причем, в отрыве от сопровождающих их определений и даже прямо игнорируя целые абзацы из определений!
Нифига себе...
Это ж как раз вторая часть пословицы получается.
Здравствуйте, samius, Вы писали:
S>>>Я неоднократно ответил. Отказываюсь считать определением полиморфизма определение полиморфной функции. V>>Не останавливайся на достигнутом. Откажись считать себя программистом. S>На том основании, что ты не распарсил слово "function" в определении, которое пытался выдать за определение полиморфизма? Это несерьезное основание.
Я давал тебе самое серьезное из всех современных обоснований — это HoTT.
В нем полиморфизмом называются "зависимые функции".
Иерархию я приводил: http://www.rsdn.org/forum/flame.comp/6700097.1
Аналогично по чуть менее серьезному, что всё еще самому серьезному среди оставшихся — это книга Пирса "Типы в ЯП".
Там он посвящает понятию "полиморфизма" целую главу V.
В этой главе о полиморфизме рассматриваются:
* Типизация на основе ограничений
* Унификация (принцип Хиндли-Милнера, когда компилятором выбирается более специализированная перегрузка в текущем контексте, т.е. более специализированное имеет преимущество над менее специализированным; в С++ похожие правила вывода с некоторыми ограничениями на сценариях автоприведения типов + конструкторов).
* определение полиморфизма (Система F) —
Система F является расширением типизированного лямбда-исчисления.
* параметричность
Тут Пирс ничего не говорит сам, а отсылает к целому списку авторов:
Понятие параметричности было введено Рейнольдсом (Reynolds, 1974, 1983). В дальнейшем ее, наряду с родственными понятиями, исследовали ...
In this paper Reynolds formalizes the idea of data abstraction: what does it mean for a client of a data type to be insensitive to the type’s choice of internal representation? An abstract data type exposes a type name and a set of operations on the type, and a client program respects the abstraction if it cannot make a concrete observation to distinguish different choices of representation for the abstract type.
...
The main generalization introduces the polymorphic λ-calculus for defining functions that are parametrically plymorphic in the sense of Strachey.
Reynolds extends the relational semantics to polymorphic types, reestablishes the abstraction theorem, and argues that the theorem captures Strachey’s informal notion of parametricity.
Переведу на русский, чтобы опять кто-то не запутался:
Основным обобщением вводится полиморфное лямбда-исчисление для определения функций, которые являются параметрически полиморфными в смысле Стрейчи.
Рейнольдс расширяет реляционную семантику до полиморфных типов, восстанавливает теорему абстракции, и утверждает, что теорема фиксирует (покрывает) неофициальное понятие Стрейчи о параметричности.
Так вот. Полиморфное лямбда-исчисление — это Система F, которая, в свою очередь, является расширением типизированного лямбда-исчисления.
Круг замкнулся.
Т.е., PP по Пирсу — это развитие типизированного лямбда исчисления (типизация на основе ограничений). ТЧК.
Здравствуйте, alex_public, Вы писали:
_>Кстати, в библиотеки алгоритмов D static if частенько используется для оптимизации. Типа есть универсальная версия алгоритма для диапазона с последовательным доступом и местами её ускорение, если переданный диапазон поддерживает произвольный доступ.
Ну, в плюсах тоже оптимизатор может выкинуть лишний код, но! Этот выкинутый код всё-равно будет валидным.
А в твоём примере одна из выкидываемых частей ф-ии получается невалидной, потому что нельзя одновременно вернуть *t и t. Я это имел ввиду, когда говорил про "режет глаз".
Здравствуйте, 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. Не думаю, что Пирс понял их как-то не так.
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>Ты так не можешь, как я погляжу.
Да уж куда уж...