LINUX.ORG.RU

[ООП ГМ]Почему 1.+(2) а не +(1, 2)


0

1

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

"a"+3 == 3+"a"

но с точки зрения убогого ООп это будет

"a".+(3) == 3.+("a")

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

★★☆
Ответ на: комментарий от anonymous

Черт, я как раз умножение матриц имел в виду. Сложение тоже не всегда коммутативно, так что момент «интуитивности» мне непонятен.

power
()
Ответ на: комментарий от wfrr

Товарищ года два назад на эту тему писал:

Начиная с того, что

a + b + c — это вовсе не a.add(b).add(c)
a + b + c = (AdditiveSemigroup.[+] a, b, c)

А вот функция AdditiveSemigroup.[+] должна извлекать наиближайшего общего предка a, b и c, имплементирующего интерфейс AdditiveSemigroup, в котором должна иметься статическая функция add(a, b), выполняющая аксиомы [аддитивной - прим. моё] полугруппы. И вот этот AdditiveSemigroup.[+] должен вызывать эту функцию для сложения

Мотивация:

Польза в большей степени структурная. Система типов языка должна уважать математику. Когда мы складываем математические объекты — это не «они знают, как к ним прибавлять число». Это структура, к которой они принадлежат, имеет определённую на себе бинарную операцию.

Почему так получилось в языках программирования:

Они думали о простоте имплементации. [...] На заре ООП, когда о перегрузке операторов ещё никто не слышал, Алана Кея в первом варианте языка смоллток закрепил за a + b значение a.add(b). [...]

Потом перегрузку операторов стали делать в других языках, и кстати, по-разному. Однако товарищ Страуструп, автор С++, сделал по-смоллтоковому. По той же причине, что и Аллан Кей: в рамках языка до появления темплейтов иначе было вообще никак.

Где-то в чем-то может и спорно, но точка зрения довольно интересная в любом случае.

gizzka ★★
()
Ответ на: комментарий от shamazmazum

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

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

>и ООП на обобщённых функциях, как в CLOS.

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

Я удивляюсь способности некоторых вести изотерические разговоры. И откуда у людей такая любовь к плаванию в бурных потоках сознания?

pathfinder ★★★★
()
Ответ на: комментарий от quasimoto

Да сколько угодно можно таких придумать. Но это все равно не в тему - я тред жопой прочитал :)

power
()
Ответ на: комментарий от Love5an

>Да, например у тебя, «изотерик»

Ну, по крайней мере, ты со мной согласен.

pathfinder ★★★★
()
Ответ на: комментарий от power

>Белка, попробуй на досуге сложить 2 матрицы :)

ты хотел сказать «умножить»? =)

yoghurt ★★★★★
()

> Ведь операция сложения определена на множестве объектов и интуитивно обладает коммутативностью

Fail!

Сложение строк некоммутативно, и это самый простой пример.

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

static_lab ★★★★★
()
Ответ на: комментарий от static_lab

>Fail!
Фэйл это у тебя.

Сложение строк некоммутативно, и это самый простой пример.

Не существует операции сложения строк. К ним применима только операция конкатенации. И «складывать» строки через «+» это невероятный долбодебилизм по своей сути. Операция _сложения_ же всегда коммутативна.

Love5an
()
Ответ на: комментарий от power

> Сложение тоже не всегда коммутативно, так что момент «интуитивности» мне непонятен.

Под сложением понимают групповую коммутативную операцию. Не зря же абелеву группу иногда называют аддитивной.

P.S. При чем здесь интуиция?

balodja ★★★
()
Ответ на: комментарий от power

>Черт, я как раз умножение матриц имел в виду. Сложение тоже не всегда коммутативно, так что момент «интуитивности» мне непонятен.

Таки да, под сложением обычно понимают коммутативную операцию. А вот умножение таки может быть некоммутативно.

Waterlaz ★★★★★
()

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

Dudraug ★★★★★
()
Ответ на: комментарий от wfrr

я намекаю что тупое следование правилам ООП не всегда полезно

С++ рулит, согласен.

Dudraug ★★★★★
()
Ответ на: комментарий от svu

Поэтому (и по другим причинам) перегрузка операторов - злое зло.

Главное руки откуда надо росли и делов-то.

Dudraug ★★★★★
()
Ответ на: комментарий от Love5an

В определении операции сложения не входит понятие коммутативности и всегда она оговаривается отдельной аксиомой. Впринципе, есть структуры, в которых определено понятие сложение и оно некоммутативно(скорее всего простейший пример можно найти в расходящихся рядах), вот пример статьи про систему с некоммутативным сложением:
http://arxiv.org/abs/1003.2081
сразу скажу в статье не шарю, но не видел, чтобы математики сразу накладывали ограничение на сложение.
Что касается строк, с операцией сложения(конкатенация), то эта система не является группой, тк есть нулевой элемент 'adflkj' + " = 'adflkj', но нет обратного элемента, такого, что 'adflkj' + ('dflkj')^-1 = "(те длина строк не может уменьшаться при сложении), но будет являться полугруппой, и мне думается, что можно даже построить изоморфизм с подполугрупой натуральных чисел(то есть показать, что алгебраически они суть «эквивалентны»).

gameover__
()
Ответ на: комментарий от balodja

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

gameover__
()
Ответ на: комментарий от gameover__

Впринципе, есть структуры, в которых определено понятие сложение и оно некоммутативно

Примеры? Сложение ординалов обозначается (+), но по сути это конкатенация. Конкатенация это как минимум некоммутативная операция моноида.

Это вопрос обозначений - но как-то принято обозначать с помощью (+) коммутативную операцию полугруппы дистрибутивную с другой операцией полугруппы, это вторая операция (*) уже определяет Абелевость/неАбелевость. (., +) и (, конкатенация) - разные АС, они не изоморфны.

quasimoto ★★★★
()
Ответ на: комментарий от gameover__

> Что касается строк, с операцией сложения(конкатенация), то эта система не является группой, тк есть нулевой элемент 'adflkj' + " = 'adflkj', но нет обратного элемента, такого, что 'adflkj' + ('dflkj')^-1 = "(те длина строк не может уменьшаться при сложении), но будет являться полугруппой, и мне думается, что можно даже построить изоморфизм с подполугрупой натуральных чисел

изоморфизм коммутативной и некоммутативной полугруппы?

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от svu

> Руки - это вообще корень всех зол.

яве, как плохому языку программирования, руки программистов мешают, это да :-)

www_linux_org_ru ★★★★★
()

(как уже тут высказалось несколько человек) в математике оператор + традиционно коммутативен

и поэтому конкатенацию им обозначать — дурной тон

белке: поздравляю с выходом из анабиоза; дизайн «современных» промышленных языков программирования до сих пор тащит за собой костыли из 60-х годов

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

Да я сам уже понял, выгоняли с работы - не успел запостить :)

gameover__
()
Ответ на: комментарий от quasimoto

Все верно, не изоморфны: одна коммутативна, другая нет, я как-то изначально задумался построить биекцию, чтобы при «левом» умножении выполнялось f(a) + f(b) = f(a+b). Насчет примера сверху статья есть, там говорят, что сложение некоммутативно в системе.

gameover__
()
Ответ на: комментарий от gameover__

Там, кстати, хороший пример - именно сложение и умножение, со всеми своими свойствами, но некоммутативные. На бинарных деревьях хорошо видно: сложение с единицей прибавляет лист, общая мощность - количество листов (аналогично кардиналам), а мультипликация - размещение одного дерева в листах другого (в том же смысле что m*n = m + m + ... + m, n раз).

quasimoto ★★★★
()
Ответ на: комментарий от svu

Руки - это вообще корень всех зол.

В рамочку и на стенку!

yoghurt ★★★★★
()
Ответ на: комментарий от static_lab

Не сложение, а конкатенция.

wfrr ★★☆
() автор топика
Ответ на: комментарий от gizzka

>Товарищ года два назад на эту тему писал

Скала, она вообще рулит. Но, увы, еще больше рулят хаскелевские typeclass'ы.

Macil ★★★★★
()
Ответ на: комментарий от gameover__

> Вот натуральные числа с определенной операцией сложения, но не являются группой.

От этого сложение натуральных чисел стало некоммутативно? И если ты такой умный, то сможешь без труда заменить слово «групповую» на «полугрупповую» :)

Я думаю от сложения требуют только замкнутости.

Коммутативности.

balodja ★★★
()
Ответ на: комментарий от balodja

Если ты посмотришь выше, то увидишь статью, где определено сложение и умножение и сложение там некоммутативно, для меня это стопроцентное доказательство, что сложение может быть некоммутативным, вопрос в некотором смысле исчерпал себя, так как это дело определений. Сейчас я лишь приведу свои доводы, почему я так считаю, но убеждать кого-либо не собираюсь: если посмотреть в любом учебнике по алгебре, то во всех стандартных АС коммутативность сложения всегда оговаривается явно отдельной аксиомой, и я ни разу не видел, чтобы про сложение говорили, что оно обязательно коммутативно.

gameover__
()
Ответ на: комментарий от gameover__

Там заменили коммутативность «самокоммутативностью» и исследуют, что из этого получается. Это отменяет традиционное понятие сложения?

balodja ★★★
()
Ответ на: комментарий от balodja

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

gameover__
()
Ответ на: комментарий от gameover__

> Хотелось бы уяснить вы несогласны с тем, что ничего страшного не случится, если не считать априори сложение коммутативным, а оговаривать это специально аксиомой?

Я вообще ничего страшного не вижу в любых манипуляциях с терминологией :) Это порой хорошо разминает мозг. За сложением просто укрепилась исторически коммутативность. Не вижу смысла ломать это «ради прикола».

Кстати, совсем не понимаю, что имеется в виду под фразой «если не считать априори сложение коммутативным, а оговаривать это специально аксиомой». В чем смысл такой постановки вопроса? Я всегда наивно полагал, что при описании алгебраических структур указываются все аксиомы, вне зависимости от их очевидности. Поэтому не могу сказать «согласен» или «не согласен». /me просто не понимает такой постановки.

P.S. Просьба сделать s/вы/ты/.

balodja ★★★
()
Ответ на: комментарий от balodja

тут имелось в виду, что можно сложение определить как бинарную коммутативную операцию, а можно определить как просто бинарную операцию. Кстати, английская википедия говорит о том, что сложение - коммутативная бинарная операция, но в абстрактной алгебре есть исключение - ординалы. Если определить сложение как коммутативную операцию, то впринципе можно не оговоривать дополнительно аксиомой коммутативность во всех АС, где есть сложение. Так делают например, когда сначала определяют композицию, а потом группу(тогда от групповой операции не требуют ассоциативности, тк она доказывается из определения композиции). По поводу указывания всех аксиом поинт хороший, но вот потом вспомнил, что выполняется не всегда.
По поводу ты/вы я применяю в интернете оба местоимения, в зависимости от того хочу ли я дать более строгую(формальную) окраску своему сообщению или же изъясняюсь более неформально, свободно. Когда дело доходит до математики чаще более оправданный подход оказывается формальный и в комплексе с ним «вы» для усиления. Учту твое пожелание на будущее.

gameover__
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.