DG>>при чем здесь вообще язык? ты хочешь сказать, что понятие ad hoc/parametric-полиморфизма зависит от языка? S>Нет, не хочу. На каком бы языке ты не записывал полиморфное сложение, это будет ad-hoc.
функция сложения от трех параметров, определенная через сложение от двух параметров — имеет полиморфизм параметрический или ad-hoc?
DG>>и сооответственно, Add — параметрически-полиморфен, а Operation<T>.Plus — ad-hoc полиморфна S>По каким признакам ты судишь?
тело функции зависит от типа аргументов — ad-hoc, иначе — parametric(есть if от типов или нет)
S>Определи вид полиморфизма следующих функций: S>
S>object OpPlus(object a, object b)
S>{
S> if(a is int && b is int)
S> return (int)a + (int)b;
S> throw new ArgumentException();
S>}
ad-hoc полиморфизм (без статической проверки). тело функции зависит от типов аргументов
S>object Add1(objecta a, object b)
S>{
S> return OpPlus(a, b);
S>}
parametric полиморфизм (без статической проверки). тело функции не зависит от типа аргументов
S>T Add<T>(T a, T b)
S>{
S> return OpPlus(a, b);
S>}
S>
parametric полиморфизм (со статической проверкой). тело функции не зависит от типа аргументов
S>>>Вобщем, как бы ты не записывал операцию сложения в исходном ее смысле, ты не сможешь складывать числа, строки, матрицы и многочлены одним способом.
DG>>это утверждение противоречит принципу инкапсуляции, ты утверждаешь, что свойства одной функции Add(T,T)->T зависят от реализации совсем другой функции operator +(T,T)->T S>Что за принцип инкапсуляции? Да, я утверждаю что свойства функции Add1 зависят от реализации совсем другой функции OpPlus. И еще утверждаю что сложение всегда ad-hoc полиморфно.
функции Swap_and_B и Swap_and_B2 какой полиморфизм имеют?
class B1<T>
{
T Swap_and_B(T x, T y)
{
return B(y, x);
}
public Func<T,T,T> B;
static T Swap_and_B2(T x, T y)
{
return B2(y, x);
}
public static Func<T,T,T> B2;
}
S> И еще утверждаю что сложение всегда ad-hoc полиморфно.
вот это есть карго-культовое мышление. ты когда-то где-то от какого-то авторитета узнал, что сложение ad-hoc полиморфно.
и теперь это утверждение пихаешь всюду где видишь сложение — не разбираясь о чем говорил тот самый авторитет, и как связана текущая ситуация с исходным утверждением.
Здравствуйте, DarkGray, Вы писали:
DG>функция сложения от трех параметров, определенная через сложение от двух параметров — имеет полиморфизм параметрический или ad-hoc?
ad-hoc
S>>По каким признакам ты судишь?
DG>тело функции зависит от типа аргументов — ad-hoc, иначе — parametric(есть if от типов или нет)
Очевидно что ты используешь своё определение, в котором имеет значение тело. В то время как я говорю о классическом определении.
DG>ad-hoc полиморфизм (без статической проверки). тело функции зависит от типов аргументов DG>parametric полиморфизм (без статической проверки). тело функции не зависит от типа аргументов DG>parametric полиморфизм (со статической проверкой). тело функции не зависит от типа аргументов
Я не подписывался обсуждать фантазии.
DG>функции Swap_and_B и Swap_and_B2 какой полиморфизм имеют? DG>
DG>class B1<T>
DG>{
DG> T Swap_and_B(T x, T y)
DG> {
DG> return B(y, x);
DG> }
DG> public Func<T,T,T> B;
DG> static T Swap_and_B2(T x, T y)
DG> {
DG> return B2(y, x);
DG> }
DG> public static Func<T,T,T> B2;
DG>}
DG>
Здравствуйте, DarkGray, Вы писали:
S>> И еще утверждаю что сложение всегда ad-hoc полиморфно.
DG>вот это есть карго-культовое мышление. ты когда-то где-то от какого-то авторитета узнал, что сложение ad-hoc полиморфно.
DG>и теперь это утверждение пихаешь всюду где видишь сложение — не разбираясь о чем говорил тот самый авторитет, и как связана текущая ситуация с исходным утверждением.
Ты ведь вообще не разбираешься, о чем кто говорит. Ты подменяешь понятия и говоришь о чем-то своем, даже не уведомляя что ты что-то подменил. Выясняется в конце разговора, если собеседник докопался.
проблема в том, что невозможно придумать миллион слов для миллиона оттенков, и поэтому используются другие подходы, в частности — fuzzy concepts.
зы
может быть тебе понятнее будет на примере цветов, как выглядит дисскусия в моих глазах.
обычно дискуссия выглядит так:
я прихожу и говорю, что rgb(220, 20, 60) — это красный, ты лезешь в вики и выясняешь, что там написано, что красный — это (255, 0, 0). и начинаешь меня критиковать за то, что я неправильно использую термины.
дальше я начинаю тебя пытать, а каким словом можно назвать цвет (254, 0, 0), (253, 0, 0), (252, 0, 0), (255, 0, 1) и т.д. — ты скрепя сердцем говоришь, что это тоже красный (хотя в вики это напрямую и не написано).
когда я пытаюсь тебе указать на разрыв в логике:
что цвет (250, 0, 0) — ты себе позволяешь называть красным, хотя это и некоторый отход от того определения, которое написано в вики,
а цвет (220, 20, 60) — ты мне называть красным уже не позволяешь, хотя это такой же отход от того определения, которое написано в вики;
и спрашиваю о твоей аргументации, как ты решаешь до какого предела цвет можно называть красным, а после какого нельзя — ты переходишь на последнюю линию обороны:
цвет (220, 20, 60) — нельзя называть красным, потому что (220, 20, 60) никогда не может быть красным.
DG>>>функции Swap_and_B и Swap_and_B2 какой полиморфизм имеют? DG>>>
DG>>>class B1<T>
DG>>>{
DG>>> T Swap_and_B(T x, T y)
DG>>> {
DG>>> return B(y, x);
DG>>> }
DG>>> public Func<T,T,T> B;
DG>>>}
DG>>>
S>>В классическом понимании — параметрический
DG>а если Swap_And_B переименовать в Add, B переименовать в Plus и убрать перевертывание параметров, то сразу станет ad-hoc? DG>я правильно тебя понял?
Нет, неправильно. Суть метода Swap_And_B заключается в вызове делегата с измененным порядком аргументов. Это полиморфное параметрически действие, как бы ты его не называл и что бы не подсвовывал в качестве делегата. Как обертка этот метод полиморфен параметрически. Но если смотреть на него с абсолютной точки зрения, не зная его реализации, то его свойства зависят от того, что ты подсунул в делегат. Очевидно, что подменяя делегат ты будешь менять свойства оборачивающего метода. Можно сделать его ad-hoc или нет, можно сделать его чистым, или нечистым. И в этом ничего удивительного нет.
Если ты в коробку из под телевизора сунешь картошку — получишь коробку картошки.
DG>
DG>class Operation<T>
DG>{
DG> static T Add(T x, T y)
DG> {
DG> return B2(x, y);
DG> }
DG> public static Func<T,T,T> Plus;
DG>}
DG>
DG>вот здесь уже ad-hoc? неисповедимы твои пути, господи...
С такой-то кашей в голове
Читай что пишут люди, а не выдумывай. В первую очередь это касается определений. Если ты что-то выдумал, то базис у тебя уже отличный от базиса людей, которые прочитали и поняли определение. Ты в другой системе понятий! Слова вроде те же, а смысл не тот!
S>>Ты подменяешь понятия и говоришь о чем-то своем
DG>проблема в том, что невозможно придумать миллион слов для миллиона оттенков, и поэтому используются другие подходы, в частности — fuzzy concepts.
DG>зы DG>может быть тебе понятнее будет на примере цветов, как выглядит дисскусия в моих глазах.
DG>обычно дискуссия выглядит так: DG>я прихожу и говорю, что rgb(220, 20, 60) — это красный, ты лезешь в вики и выясняешь, что там написано, что красный — это (255, 0, 0). и начинаешь меня критиковать за то, что я неправильно использую термины.
Ох уж эти сказочники...
Ты делаешь качественную подмену понятий а потом на примере легкой подмены цвета (количественной характеристики) показываешь свою позицию? Ну-ну.
S>Нет, неправильно. Суть метода Swap_And_B заключается в вызове делегата с измененным порядком аргументов.
А суть метода Zzz(T x, T y){return xx(x, y);} заключается в том, что он дает еще одно имя для произвольного действия. и эта суть параметрически-полиморфна, она не зависит от того, чем является xx.
S> Но если смотреть на него с абсолютной точки зрения, не зная его реализации, то его свойства зависят от того, что ты подсунул в делегат. Очевидно, что подменяя делегат ты будешь менять свойства оборачивающего метода. Можно сделать его ad-hoc или нет, можно сделать его чистым, или нечистым. И в этом ничего удивительного нет. S>Если ты в коробку из под телевизора сунешь картошку — получишь коробку картошки.
так никто тебя и не спрашивает каким свойством обладает коробка + содержимое, а спрашивают каким свойством обладает сама коробка в независимости от содержимого?
S>>Нет, неправильно. Суть метода Swap_And_B заключается в вызове делегата с измененным порядком аргументов.
DG>А суть метода Zzz(T x, T y){return xx(x, y);} заключается в том, что он дает еще одно имя для произвольного действия. и эта суть параметрически-полиморфна, она не зависит от того, чем является xx.
Вижу, что ты не отличаешь суть "являться именем произвольного действия" от сути "являться именем сложения".
DG>так никто тебя и не спрашивает каким свойством обладает коробка + содержимое, а спрашивают каким свойством обладает сама коробка в независимости от содержимого?
Я ответил на оба вопроса. А ты не ответил, почему у тебя одинаковые функции обладают разными свойствами. Только не надо мне отвечать про ТВОЙ полиморфизм, основанный на телах.
Здравствуйте, DarkGray, Вы писали:
S>>Ты делаешь качественную подмену понятий а потом на примере легкой подмены цвета (количественной характеристики) показываешь свою позицию? Ну-ну.
DG>так (220, 20, 60) можно называть красным или нельзя?
Можно. Можно называть зеленым, но не рассчитывай на понимание.
Здравствуйте, DarkGray, Вы писали:
B>>Глобальная.. От языка разметки, создания сайтов, до обычного программирования. Как императивного так и декларативных. В том числе и логических типа Пролога. Работает одновременно и в режиме интерпретации и компиляции.. В то же время может описывать грамматики.. Т.е является метааязыком. В частности создает сам себя.. Вообщем единый синтаксис во всем.. Ну и море других плюсов и плюсиков..
DG>есть что-то на нем уже написанное? насколько большое? DG>во что компилируется?
Нет. Пока все только в документации. И транслятор-демка. Вообще это не транслятор. Нет такого вообще. Это редактор концептов, он заменяет вообще все. И транслтор и редактор и браузер..Приложений нет как таковых..
B>>Из минусов с виндой не гармонирует..
DG>в смысле? как может язык с ОС не гармонировать?
Ну, так.. Даже расширений файлов нет. Все в едином формате.. И своя виртуальная машина..
B>> Даже алфавит строится по другому как частный случай перечислимых концептов. Да.. Я назвал это концептной парадигмой.. Можно и субъектной.. Потому как операторы (и вообще все понятия) создаются из концептов как объекты из классов..
DG>что такое концепт?
Концепт это наше все А без шуток, это единица с которой может работать компьютер. Теперь зададим вопрос, а что должно быть известно компьютеру для того что б он с этим "нечто" сомг работать. Оказывается необходимы всего две вещи :
1. Размер.
2. Программа запускаемая для реализации этого "нечто".
Добавим к этому "нечто" правила конструирования новых концептов и синтаксис, и назовем это концептом. Конечно, необходимы базовые концепты что бы мы могли создать все что угодно. Базовых концептов всего 5 Это сам концепт (Сoncept), Byte (определяющий размер), Property (определяет свойства концепта), Selector (формирующий адрес) и Document как загрузочная единица. К этим базовым концептам добавлены правила их объединения — группы. В тексте объединение концептов происходит с помощью скобок, каждая их которых соотвествует концептам -группам. Т.е. еще одной частью являются правила объединения или правила применения скобок или, как я назвал, правила группирования. Вкратце это все. К этому добавлю что программа реализующая концепт находится в обязательном свойстве Child.
DG>>так никто тебя и не спрашивает каким свойством обладает коробка + содержимое, а спрашивают каким свойством обладает сама коробка в независимости от содержимого? S>Я ответил на оба вопроса. А ты не ответил, почему у тебя одинаковые функции обладают разными свойствами. Только не надо мне отвечать про ТВОЙ полиморфизм, основанный на телах.
попробуй убрать эмоции, и написать автоматическую функцию, которая на вход берет код(например, в виде Ast-а), а на выходе выдает enum Polymorphism{ad-hoc, parametric, subtype, none}.
гарантирую, что с твоей трактовой полиморфизма такую функцию написать нельзя (а значит твое определение — магия, не имеющая алгоритмической основы).
зы
лучше, кстати, скажи — полиморфизм, кроме parametric, ad-hoc и subtype на твой взгляд еще какой-нибудь бывает?
Здравствуйте, DarkGray, Вы писали:
S>>Я ответил на оба вопроса. А ты не ответил, почему у тебя одинаковые функции обладают разными свойствами. Только не надо мне отвечать про ТВОЙ полиморфизм, основанный на телах.
Ты опять ушел от ответа.
DG>попробуй убрать эмоции, и написать автоматическую функцию, которая на вход берет код(например, в виде Ast-а), а на выходе выдает enum Polymorphism{ad-hoc, parametric, subtype, none}. DG>гарантирую, что с твоей трактовой полиморфизма такую функцию написать нельзя (а значит твое определение — магия, не имеющая алгоритмической основы).
Твоя гарантия, наверное, связана с тем, что задача некорректно поставлена. Легко написать функцию, обладающую признаками проявлений всех форм полиморфизма в одном теле, так что твой enum Polymorphism просто не сможет описать результат. Написать функцию, которая принимает AST и возвращает набор флагов не так уж и сложно. Никаких препятствий я не наблюдаю, но заниматься этим, разумеется тоже не собираюсь.
Далее, я не считаю саму невозможность написать такую функцию угрозой для определения полиморфизма из википедии. И конечно же, ты зря приписываешь мне это определение. Тут только ты выдумываешь определения для вещей, определения которым даны до тебя.
Твои определения (каждое в отдельности) страдают как минимум тем недостатком, что их формулировку никто кроме тебя не знает и соответственно, не понимает. На что ты рассчитываешь при общении с людьми — мне не понятно.
DG>зы DG>лучше, кстати, скажи — полиморфизм, кроме parametric, ad-hoc и subtype на твой взгляд еще какой-нибудь бывает?
Это зависит от способа классификации. Видишь ли, если я скажу что не бывает, ты вставишь что полиморфизм бывает еще и статический и динамический. И что мне, потом спорить с тобой что это не отдельная форма? Нет уж.
А вообще у полиморфизма много проявлений. Можно, например, вилкой в ухе ковырять. Не параметрический, не ad-hoc, не subtype, но определенно полиморфизм. А можно известным терминам выдумывать новые смыслы, что бы потроллить на форуме. Тоже полиморфизм.
S>Я ответил на оба вопроса. А ты не ответил, почему у тебя одинаковые функции обладают разными свойствами. Только не надо мне отвечать про ТВОЙ полиморфизм, основанный на телах.
одинаковые они только тем, что они делают одно и тоже.
строение у них при этом разное — одна есть надстройка над другой, при этом надстройка является параметрически-полиморфной, не зависящей от типа.
Здравствуйте, DarkGray, Вы писали:
S>>Я ответил на оба вопроса. А ты не ответил, почему у тебя одинаковые функции обладают разными свойствами. Только не надо мне отвечать про ТВОЙ полиморфизм, основанный на телах.
DG>одинаковые они только тем, что они делают одно и тоже. DG>строение у них при этом разное — одна есть надстройка над другой, при этом надстройка является параметрически-полиморфной, не зависящей от типа.
Это как это одна зависит от типа, другая нет, а делают одно и то же одним и тем же способом... Что-то темнишь.
S>Это как это одна зависит от типа, другая нет, а делают одно и то же одним и тем же способом... Что-то темнишь.
первая функция лишь перенаправляет входные данные во вторую функцию, а полученный ответ от второй функции перенаправляет как свой ответ.
и эту работу она делает параметрически полиморфно, не делая различий по типу.
S>>Это как это одна зависит от типа, другая нет, а делают одно и то же одним и тем же способом... Что-то темнишь.
DG>первая функция лишь перенаправляет входные данные во вторую функцию, а полученный ответ от второй функции перенаправляет как свой ответ. DG>и эту работу она делает параметрически полиморфно, не делая различий по типу.
И какая по-твоему польза от мнимой параметричности первой функции? Может она стала типобезопасной? Где бенефит?
S>И какая по-твоему польза от мнимой параметричности первой функции? Может она стала типобезопасной? Где бенефит?
Эта функция инкапсулирует внутри себя ad-hoc полиморфизм, позволяя записывать более сложные параметрические полиморфизмы простым образом.
Например, Сnk можно записать так
T Cnk<T>(T n, T k)
{
return Div(Factorial(n, k), Factorial(n - k));
}
T Factorial(T n, T k = One<T>())
{
T result = One<T>();
for (T i = k; Lte(i, n); Add(i, One<T>()))
{
result = Mul(result, i);
}
return result;
}
T Add<T>(T x, T y)
{
return Operation<T>.Plus;
}
T Div<T>(T x, T y)
{
return Operation<T>.Divide;
}
[...]