Pull to refresh

Comments 22

Это еще только начало материала :)

Прошу не ограничиваться этой статьёй, ждём все, что есть!)

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

Долгое ожидание может смениться делами, которые "съедят" время.

Я решил, что раз людям хочется переводить самостоятельно, то кто я такой, чтобы им мешать :)


Тем временем, Марк начал писать со скоростью генератора случайных цепочек символов, так что если начать переводить всё — можно реально офигеть


Можешь посоветовать, что именно тебе хочется почитать первым?

Блин, со своим изберательным чтением я упустил, что это перевод( Так что почитаю оригинал. Но было бы круто если подскажешь/напишешь/переведешь какие-то толковые практические примеры использования алгебраических типов. Все говорят о их пользе, но приводят, в оновном, абстрактные примеры. Было бы круто почитать в эту сторону.
И всё же «ты» вместо «вы» неприятно режет ухо.
Не смог понять что такое свободный моноид из-за этого:
Моноид (не путать с монадой) — это бинарная операция, которая удовлетворяет двум законам моноида: операция должна быть ассоциативной и должен существовать нейтральный элемент (единица).
Существует еще как минимум один моноид над числами, и это — последовательность.

Т.е. последовательность — это бинарная операция? Как это вообще?
ну вот так :)

моноид — это комбинация бинарной операции (например, конкатенации методом Concat) и типа данных над которым она работает (например, строки или массивы). Ну знаете, как в классическом ООП, класс — это абстрактный тип данных и набор операций над ним :)

дальше, по вашему вопросу. Мы приходим к старому как мир вопросу способа описания/моделирования. Например, что такое квадрат? Это какой-то набор признаков (равные углы по 90 градусов, равные стороны), или алгоритм рисования квадрата? Мышление алгоритмами/построениями не идеально — например, в древности возникла задача изучения свойств диагонали квадрата (в частности квадратного корня из двух), что привело к построению несоизмеримых отрезков — есть легенда, что Пифагор по этой теме утопил ученика. Но в целом, доказательство и описание построением — вполне популярные и легитимные вещи. Квадрат — это нечто, что получилось в результате алгоритма рисвания квадрата

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

Откуда может взяться последовательность? Либо склейкой уже готовых последовательностей, либо надо собрать их из отдельных элементов. Первый случай — очевидный, по поводу второго в тексте есть заготовленный пример:

var three = new[] { 3 };
var four = new[] { 4 };
var combination = three.Concat(four);

Если последовательность — это то, что всегда получается в результате применения моноида конкатенации, значит последовательность и есть моноид конкатенации. Точно так же как с квадратом, алгоритм построения квадарата и есть квадрат.

Поэтому в тексте они употреблены как синонимы — вероятно, с целью упростить формулировку

А свобода тут в том, что в комбинации (тип данных + операция + данные), операция — не захардкожена, мы можем ее поменять потом. Паттерн стратегия
Если последовательность — это то, что всегда получается в результате применения моноида конкатенации, значит последовательность и есть моноид конкатенации.
По такой логике выходит, что если в результате применения моноида суммы целых чисел всегда получается целое число, то целое число и есть моноид суммы целых чисел? Тогда целое число есть и моноид умножения целых чисел тоже? Из чего можно подумать об эквивалентности этих моноидов :)

А в целом, с учетом Вашего комментария и ссылки из статьи, стало понятнее, спасибо!
Интересно. Непонятно только, зачем это всё — каково практическое применение?

Я недавно применил моноиды (правда я не знал, что в ФП так называются сами операции, а не множества значений, получающихся в результате применения этой операции) со сложными типами данных, для того, что бы иметь возможность сделать «конструктор» программ (последовательность композиции операций задавалась конфигом). Но никакие из свойств моноидов я не применял и не представляю, как применить. :)
У автора есть множество статей в его блоге: blog.ploeh.dk
где он обсуждает практические применения. К сожалению, зачастую, из-за терминологии звучат они как борщ из заумных слов. Наверное, поэтому он и начал писать эту серию постов, чтобы священные тексты начали поддаваться расшифровке.

Я по-возможности буду тащить на Хабр самое ценное из брейндампов автора, но есть момент: он пишет целыми сериями, и переводить отдельный пост не имеет смысла. Нужно переводить сразу всю серию.

ну и как всегда <маркетинг>можно прийти на конфу DotNext и задать ему такие вопросы лично</маркетинг>

Применение — Map Reduce.
Есть какая-то дичь (например, набор всех постов в твитере, или зарплаты сотрудников, или что угодно другое) — мапим дичь в моноидный тип (какой-то тип для отчётов)
Далее, имея все бонусы моноида, редьюсим (агрегируем до отчёта по всем постам в твитере).


Бонусы моноидного типа данных — халявная параллелизация в кластере.
Плюс инкрементируемость. Т.е. если вы уже посчитали отчёт за период 2000-2017 и он лежит в моноидном типе достаточно посчитать отчёт за 2018 и "прибавить" к уже посчитанному.

Вот ведь, только сейчас понял, что у меня все время путались ассоциативность с коммутативностью :)
>> Изучив этот раздел, вы поймете, что такое моноид и чем он отличается от полугруппы.
Не нашел где написано в чем отличие от полугруппы.
Тем что в моноиде есть элемент нейтральный относительно опрации.
Одно из самых полезных применений моноида — в дереве отрезков, которое для отрезка [1, n] хранит в узлах результаты операции только на некоторых подотрезках (длины 2^k, не пересекающихся друг с другом на каждом значении длины), а за счёт свойств моноида результат на произвольном подотрезке можно получить за O(log n), потому что любой подотрезок оказывается полностью покрыт <= 4 сохранёнными в дереве подотрезками, и нужно только найти в дереве эти результаты и выполнить над ними операцию. Ну, и обновление элемента тоже за O(log n), потому что он входит в такое количество сохранённых в дереве подотрезков.
«Closure of Operations» похоже можно перевести как «Замкнутость относительно операции». Например, множество натуральных чисел замкнуто относительно операции сложения, то есть сумма двух натуральных чисел является натуральным числом. Но при этом множество простых чисел не замкнуто относительно сложения.
А можете объяснить пожалуйста, почему единица для all — это булевский and, а any — булевский or?
Немного не так. Моноид с названием
all: ({True, False},(and)) нейтральный элемент True;
any: ({True, False},(or)) нейтральный элемент False.
Sign up to leave a comment.