Comments 22
Прошу не ограничиваться этой статьёй, ждём все, что есть!)
Долгое ожидание может смениться делами, которые "съедят" время.
Я решил, что раз людям хочется переводить самостоятельно, то кто я такой, чтобы им мешать :)
Тем временем, Марк начал писать со скоростью генератора случайных цепочек символов, так что если начать переводить всё — можно реально офигеть
Можешь посоветовать, что именно тебе хочется почитать первым?
Моноид (не путать с монадой) — это бинарная операция, которая удовлетворяет двум законам моноида: операция должна быть ассоциативной и должен существовать нейтральный элемент (единица).
Существует еще как минимум один моноид над числами, и это — последовательность.
Т.е. последовательность — это бинарная операция? Как это вообще?
моноид — это комбинация бинарной операции (например, конкатенации методом Concat) и типа данных над которым она работает (например, строки или массивы). Ну знаете, как в классическом ООП, класс — это абстрактный тип данных и набор операций над ним :)
дальше, по вашему вопросу. Мы приходим к старому как мир вопросу способа описания/моделирования. Например, что такое квадрат? Это какой-то набор признаков (равные углы по 90 градусов, равные стороны), или алгоритм рисования квадрата? Мышление алгоритмами/построениями не идеально — например, в древности возникла задача изучения свойств диагонали квадрата (в частности квадратного корня из двух), что привело к построению несоизмеримых отрезков — есть легенда, что Пифагор по этой теме утопил ученика. Но в целом, доказательство и описание построением — вполне популярные и легитимные вещи. Квадрат — это нечто, что получилось в результате алгоритма рисвания квадрата
возвращаясь к моноиду конкатенации. В результате применения этой бинарной операции может получиться последовательность. Точнее, последовательность обычно и получается именно этим способом.
Откуда может взяться последовательность? Либо склейкой уже готовых последовательностей, либо надо собрать их из отдельных элементов. Первый случай — очевидный, по поводу второго в тексте есть заготовленный пример:
var three = new[] { 3 };
var four = new[] { 4 };
var combination = three.Concat(four);
Если последовательность — это то, что всегда получается в результате применения моноида конкатенации, значит последовательность и есть моноид конкатенации. Точно так же как с квадратом, алгоритм построения квадарата и есть квадрат.
Поэтому в тексте они употреблены как синонимы — вероятно, с целью упростить формулировку
А свобода тут в том, что в комбинации (тип данных + операция + данные), операция — не захардкожена, мы можем ее поменять потом. Паттерн стратегия
Если последовательность — это то, что всегда получается в результате применения моноида конкатенации, значит последовательность и есть моноид конкатенации.По такой логике выходит, что если в результате применения моноида суммы целых чисел всегда получается целое число, то целое число и есть моноид суммы целых чисел? Тогда целое число есть и моноид умножения целых чисел тоже? Из чего можно подумать об эквивалентности этих моноидов :)
А в целом, с учетом Вашего комментария и ссылки из статьи, стало понятнее, спасибо!
Я недавно применил моноиды (правда я не знал, что в ФП так называются сами операции, а не множества значений, получающихся в результате применения этой операции) со сложными типами данных, для того, что бы иметь возможность сделать «конструктор» программ (последовательность композиции операций задавалась конфигом). Но никакие из свойств моноидов я не применял и не представляю, как применить. :)
где он обсуждает практические применения. К сожалению, зачастую, из-за терминологии звучат они как борщ из заумных слов. Наверное, поэтому он и начал писать эту серию постов, чтобы священные тексты начали поддаваться расшифровке.
Я по-возможности буду тащить на Хабр самое ценное из брейндампов автора, но есть момент: он пишет целыми сериями, и переводить отдельный пост не имеет смысла. Нужно переводить сразу всю серию.
ну и как всегда <маркетинг>можно прийти на конфу DotNext и задать ему такие вопросы лично</маркетинг>
Применение — Map Reduce.
Есть какая-то дичь (например, набор всех постов в твитере, или зарплаты сотрудников, или что угодно другое) — мапим дичь в моноидный тип (какой-то тип для отчётов)
Далее, имея все бонусы моноида, редьюсим (агрегируем до отчёта по всем постам в твитере).
Бонусы моноидного типа данных — халявная параллелизация в кластере.
Плюс инкрементируемость. Т.е. если вы уже посчитали отчёт за период 2000-2017 и он лежит в моноидном типе достаточно посчитать отчёт за 2018 и "прибавить" к уже посчитанному.
Не нашел где написано в чем отличие от полугруппы.
Моноиды, полугруппы и все-все-все