Здравствуйте, nikov, Вы писали:
N>Здравствуйте, Mystic, Вы писали:
M>>Я вот подумал, а почему конкатенация строк обозначается чимволом '+'
N>Потому что к одной строке добавляется другая
Задумался над умножением / делением строк в столбик...
Я вот подумал, а почему конкатенация строк обозначается чимволом '+' и никогда символом '*'? Хотя символ '*' более логичен. Множество строк с операцией конкатенации образуют моноид, а в нем рассматривается именно умножение. Далее, есть единичный элемент (пустая строка). Операция некоммутативна, но ассоциативна ('+' обозначается групповая операция в абелевых группах, в них же единица называется нулем).
Другие известные мне обозначения '.' и '||' достаточно нейтральны.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
08.11.07 21:31: Перенесено модератором из 'О жизни' — туда, где сии высокоумные мысли обсуждать благополезнее — Кодт
Здравствуйте, Пётр Седов, Вы писали: ПС>SNOBOL represents concatenation by an empty space operator,
Кстати, в книге дракона (Ахо, Сети, Ульман) конкатенация строк (а также языков и регулярных выражений) тоже обозначается пустым местом (как умножение в математике):
Глава 3. Лексический анализ
… 3.3. Определение токенов
… Строки и языки
… Пустая строка, обозначаемая как ε, представляет собой специальную строку нулевой длины.
…
Если x и y — строки, то конкатенация строк x и y, которая записывается как xy, является строкой, сформированной путём дописывания y к x. Например, если x = dog, а y = house, то xy = doghouse. Пустая строка представляет собой единичный элемент по отношению к операции конкатенации, то есть для любой строки s справедливо соотношение sε = εs = s.
Если рассматривать конкатенацию как операцию «умножения», то можно определить операцию «возведения в степень» следующим образом. Определим, что , а для i > 0 определим как . Поскольку εs — просто s, то . Соответственно, , и так далее.
Также в C/C++ компилятор собирает соседние строковые литералы в один. Например:
printf("Hell" "o World!" "\n"); // компилятор соберёт в "Hello World!\n"
На основе этого в библиотеке MFC указывается сигнатура метода (список типов параметров).
afxdisp.h:
...
// parameter types: by value VTs#define VTS_I2 "\x02"// a 'short'#define VTS_I4 "\x03"// a 'long'#define VTS_R4 "\x04"// a 'float'#define VTS_R8 "\x05"// a 'double'#define VTS_CY "\x06"// a 'CY' or 'CY*'#define VTS_DATE "\x07"// a 'DATE'#define VTS_WBSTR "\x08"// an 'LPCOLESTR'#define VTS_DISPATCH "\x09"// an 'IDispatch*'#define VTS_SCODE "\x0A"// an 'SCODE'#define VTS_BOOL "\x0B"// a 'BOOL'#define VTS_VARIANT "\x0C"// a 'const VARIANT&' or 'VARIANT*'#define VTS_UNKNOWN "\x0D"// an 'IUnknown*'
...
Здравствуйте, int13h, Вы писали:
M>>Я вот подумал, а почему конкатенация строк обозначается чимволом '+' и никогда символом '*'? Хотя символ '*' более логичен. Множество строк с операцией конкатенации образуют моноид, а в нем рассматривается именно умножение. Далее, есть единичный элемент (пустая строка). Операция некоммутативна, но ассоциативна ('+' обозначается групповая операция в абелевых группах, в них же единица называется нулем). I>сдесь без поллитры не разобрацца
Чтобы разобраться, нужна не «поллитра», а книга по математике. Например, «Дискретная математика для программистов» (автор: Фёдор Новиков):
Глава 2. Алгебраические структуры
… 2.3. Алгебры с одной операцией
… 2.3.1. Полугруппы Полугруппа – это алгебра с одной ассоциативной бинарной операцией:
. Пример
1. Множество слов в алфавите A образует полугруппу относительно операции конкатенации.
… 2.3.2. Моноиды Моноид – это полугруппа с единицей:
. Пример
1. Множество слов в алфавите A вместе с пустым словом Λ образует моноид.
… 2.3.3. Группы Группа – это моноид, в котором
.
Элемент называется обратным. Пример
1. Множество невырожденных квадратных матриц порядка n образует группу относительно операции умножения матриц. Единицей группы является единичная матрица. Обратным элементом является обратная матрица.
… Коммутативная группа, то есть группа, в которой
,
называется абелевой. В абелевых группах приняты следующие обозначения: групповая операция обозначается + или , обратный элемент к a обозначается -a, единица группы обозначается 0 и называется нулём. Пример
1. – множество целых чисел образует абелеву группу относительно сложения. Нулём группы является число 0. Обратным элементом является число с противоположным знаком: .
2. – множество положительных рациональных чисел образует абелеву группу относительно умножения. Нулём группы является число 1. Обратным элементом является обратное число: .
M>>Другие известные мне обозначения '.' и '||' достаточно нейтральны. I>А мне + удобней и логичней, плюс, он и в Африке +
Обозначать конкатенацию строк плюсом – это программистская традиция/привычка. Логика здесь туманная, так как в математике плюс (и плюс в кружке) обозначает коммутативные операции.
Здравствуйте, Mystic, Вы писали: M>Какой однако разброд и шатание...
Raphael Finkel в книге «Advanced Programming Language Design» пишет:
Chapter 9. Aggregates
… 9.1 Strings
… 9.1.1 Literals and Simple Operations
…
Another simple operation is concatenation, often represented by the overloaded operator + . (SNOBOL represents concatenation by an empty space operator, which is quite confusing, particularly since the same invisible operator also represents pattern matching!) In addition, a few languages, such as ABC, provide operators for string repetition ("ho" * 3 is "hohoho"), string length, and arcane operations such as finding the minimum character in a string.
… 9.1.6 SNOBOL
SNOBOL was developed by Ralph E. Griswold and others at Bell Telephone Laboratories around 1965 [Griswold 71]. It has a strange syntax, partially because it was developed before Algol-like syntax became popular. Spaces act as both the concatenation and the match operators.
Здравствуйте, Mystic, Вы писали:
M>Я вот подумал, а почему конкатенация строк обозначается чимволом '+' и никогда символом '*'? Хотя символ '*' более логичен. Множество строк с операцией конкатенации образуют моноид, а в нем рассматривается именно умножение. Далее, есть единичный элемент (пустая строка). Операция некоммутативна, но ассоциативна ('+' обозначается групповая операция в абелевых группах, в них же единица называется нулем).
M>Другие известные мне обозначения '.' и '||' достаточно нейтральны.
В Питоне строки складываются плюсом. Зато строку можно умножить на число — иногда очень удобно, например отступы делать.
Здравствуйте, Пётр Седов, Вы писали:
[skipped]
Ну это, конечно, все хорошо... Только когда-то давно, когда я не знал, как объединить строки, первое, что пришло в голову — это "плюс". Думаю, большинству интуитивнее именно плюс И не надо смешивать элементарный здравый смысл и математические структуры. Они тут ни к чему
Здравствуйте, Mystic, Вы писали:
M>Я вот подумал, а почему конкатенация строк обозначается чимволом '+' и никогда символом '*'? Хотя символ '*' более логичен. Множество строк с операцией конкатенации образуют моноид, а в нем рассматривается именно умножение. Далее, есть единичный элемент (пустая строка). Операция некоммутативна, но ассоциативна ('+' обозначается групповая операция в абелевых группах, в них же единица называется нулем).
Это из серии "меньшей неожиданности". Люди начинают учиться программировать, как правило, с Бэйсика.
Здравствуйте, Mystic, Вы писали:
M>Я вот подумал, а почему конкатенация строк обозначается чимволом '+' и никогда символом '*'? Хотя символ '*' более логичен. Множество строк с операцией конкатенации образуют моноид, а в нем рассматривается именно умножение. Далее, есть единичный элемент (пустая строка). Операция некоммутативна, но ассоциативна ('+' обозначается групповая операция в абелевых группах, в них же единица называется нулем).
M>Другие известные мне обозначения '.' и '||' достаточно нейтральны.
В языках, где об этом задумывались, такой проблемы нет. Например в хаскеле списки соединяются оператором ++ из другого класса типов.
The binary operator ~ is the cat operator. It is used to concatenate arrays:
int[] a;
int[] b;
int[] c;
a = b ~ c; // Create an array from the concatenation of the
// b and c arrays
Many languages overload the + operator to mean concatenation. This confusingly leads to, does:
"10" + 3
produce the number 13 or the string "103" as the result? It isn't obvious, and the language designers wind up carefully writing rules to disambiguate it — rules that get incorrectly implemented, overlooked, forgotten, and ignored. It's much better to have + mean addition, and a separate operator to be array concatenation.
Similarly, the ~= operator means append, as in:
a ~= b; // a becomes the concatenation of a and b
Concatenation always creates a copy of its operands, even if one of the operands is a 0 length array, so:
a = b; // a refers to b
a = b ~ c[0..0]; // a refers to a copy of b
C++ Strings are stuck with overloading existing operators. The obvious choice for concatenation is += and +. But someone just looking at the code will see + and think "addition". He'll have to look up the types (and types are frequently buried behind multiple typedef's) to see that it's a string type, and it's not adding strings but concatenating them.
Additionally, if one has an array of floats, is '+' overloaded to be the same as a vector addition, or an array concatenation?
In D, these problems are avoided by introducing a new binary operator ~ as the concatenation operator. It works with arrays (of which strings are a subset). ~= is the corresponding append operator. ~ on arrays of floats would concatenate them, + would imply a vector add. Adding a new operator makes it possible for orthogonality and consistency in the treatment of arrays. (In D, strings are simply arrays of characters, not a special type.)
Здравствуйте, iZEN, Вы писали:
ZEN>Это из серии "меньшей неожиданности". Люди начинают учиться программировать, как правило, с Бэйсика.
Нифигаааа!!!!
Я учился программировать — в восьмеричных кодах Минска-22...
Наверное поэтому я до сих пор не люблю Васик...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, SergH, Вы писали:
SH>В Питоне строки складываются плюсом. Зато строку можно умножить на число — иногда очень удобно, например отступы делать.
И не только строки, а ещё и кортежи и списки.
Кстати, вот! Пример того, как сложение (пусть и некоммутативное) обобщается до умножения.
Здравствуйте, kochetkov.vladimir, Вы писали:
M>>>Я вот подумал, а почему конкатенация строк обозначается чимволом '+' N>>Потому что к одной строке добавляется другая KV>Задумался над умножением / делением строк в столбик...
Раз уж строка почти всегда — массив (читай: вектор), то паркуа бы и нет
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, Mystic, Вы писали:
M>Я вот подумал, а почему конкатенация строк обозначается чимволом '+' и никогда символом '*'? Хотя символ '*' более логичен. Множество строк с операцией конкатенации образуют моноид, а в нем рассматривается именно умножение. Далее, есть единичный элемент (пустая строка). Операция некоммутативна, но ассоциативна ('+' обозначается групповая операция в абелевых группах, в них же единица называется нулем).
M>Другие известные мне обозначения '.' и '||' достаточно нейтральны.
Случайно увидел тут переписку, Никто не отреагировал на слово "моноид". Видимо тут непонимание, как называется операция, и что такое 1. Что такое 0 (или 1) для нашего моноида понятно. А как назвать операцию — никого отношения не имеет. И очень странно, для чел, который оперирует такими понятиями, придираться к имени операции. Т.е. языки программирования это вам не математика! как хотим, так и называем. И нечего тут моноиды нам втюхивать.
поставлю смайлик, а то опять никто не поймет.
Нет поставлю два, а то вон тот еще не понял вроде.
Здравствуйте, Сергей Мухин, Вы писали:
СМ>Случайно увидел тут переписку, Никто не отреагировал на слово "моноид". Видимо тут непонимание, как называется операция, и что такое 1. Что такое 0 (или 1) для нашего моноида понятно. А как назвать операцию — никого отношения не имеет. И очень странно, для чел, который оперирует такими понятиями, придираться к имени операции. Т.е. языки программирования это вам не математика! как хотим, так и называем. И нечего тут моноиды нам втюхивать.
А чё такого? Ну моноид?
Берём любимый язык для теоретизирования вокруг моноидов — Гофер Ну ладно, берём Хаскелл. Моноиды — воплощения класса MonadPlus, над которым определены mzero и mplus (а в Гофере синонимом mplus был — несложно догадаться — (++) ).
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, SergH, Вы писали:
SH>>В Питоне строки складываются плюсом. Зато строку можно умножить на число — иногда очень удобно, например отступы делать. К>И не только строки, а ещё и кортежи и списки.
К>Кстати, вот! Пример того, как сложение (пусть и некоммутативное) обобщается до умножения.
Ага, причем до коммутативного (в смысле что 3*"ho" и "ho"*3 — это одно и то же "hohoho")
Ну и домены разные получаются у операций.
P.S. Кстати, нет проблем в С++ определить оператор умножения для, скажем, std::string, как-нть так:
std::string operator*(const std::string& src, int i)
{
std::string ret;
ret.reserve( i*src.length() );
while (i--) ret.append( src );
return ret;
}
ну и для любого "стандартного" класса-последовательности (string, vector, list, deque etc):
Здравствуйте, Кодт, Вы писали: К>Кстати, вот! Пример того, как сложение (пусть и некоммутативное) обобщается до умножения.
Конкатенация строк похожа на умножение матриц:
* некоммутативность: A * B ≠ B * A (в общем случае)
* ассоциативность: (A * B) * C = A * (B * C)
(Кстати, иногда так и говорят: конкатенация матриц (matrix concatenation).)
Поэтому, если уж придумывать оператор повторения строки, то, глядя на матричное равенство
A * A * A = A³
вспоминается ** (Fortran-овский оператор возведения в степень).
Похоже, на пути эволюции «математик -> программист» закрался логарифм , так как:
log(a * b * c) = log(a) + log(b) + log(c)
log(aⁿ ) = n * log(a)
Здравствуйте, Mystic, Вы писали:
M>Я вот подумал, а почему конкатенация строк обозначается чимволом '+' и никогда символом '*'? Хотя символ '*' более логичен. Множество строк с операцией конкатенации образуют моноид, а в нем рассматривается именно умножение. Далее, есть единичный элемент (пустая строка). Операция некоммутативна, но ассоциативна ('+' обозначается групповая операция в абелевых группах, в них же единица называется нулем).
сдесь без поллитры не разобрацца
M>Другие известные мне обозначения '.' и '||' достаточно нейтральны.
А мне + удобней и логичней, плюс, он и в Африке +
Здравствуйте, Пётр Седов, Вы писали:
ПС>Здравствуйте, Mystic. ПС>В Visual Basic-е конкатенация строк обозначается & (амперсанд). В Lua конкатенация строк обозначается .. (две точки).
В РНР точка (хотя напрягает иногда после ЖабаСкрипта)
Здравствуйте, int13h, Вы писали:
M>>Другие известные мне обозначения '.' и '||' достаточно нейтральны. I>А мне + удобней и логичней
I>плюс, он и в Африке +