Ayrat
Если я определю это и ещё одну 'a -> M<'a>, я получу свою монаду или нет?
ну ещё пару законов если докинешь сверху к этим функциям - получишь
Ayrat
моноид тоже требует соблюдения пары законов
Михаил
Тех же?
Ayrat
Других
Ayrat
типа a + 0 = a = 0 + a
Михаил
У моноида это замкнутость операции и наличие нулевого элемента, так?
Михаил
А у монады?
Ayrat
У моноида это замкнутость операции и наличие нулевого элемента, так?
но ещё и ассоциативность (a + b) + c = a + (b + c) это самое главное!
Ayrat
без него вся бигдата накрылась бы к хуям
Ayrat
в бигдате всё обмазано моноидами.
Ayrat
я бы сказал всё на них и работает
Ayrat
это очень важный закон, который позволяет распараллеливать, сохранять и переиспользовать результаты агрегаций
Михаил
Оу
Михаил
Вот это я пропустил мимо ушей
Михаил
Ну да ладной, давай уже сладенькое
Михаил
Что там у монады должно быть?
Ayrat
А у монады?
левая, правая айдентити я тебе копипастну тупо хаскель Law 1: return x >>= f behaves the same as f x. Law 2: m >>= return behaves the same as m. Law 3: (m >>= f) >>= g behaves the same as m >>= (fun x -> f x >>= g).
Михаил
ЯННП
Ayrat
где >>= это бинд
Ayrat
или фмап
Ayrat
а ретурн это лифт или pure
Михаил
ЫЫЫ
Ayrat
их называют везде по-разному
Ayrat
ОКЕЙ, напишу для монады LIST
Denis
легче всего это все понять если поюзать async { }
Denis
(имхо)
Михаил
Я на сишарпе async еле освоил, в фаршевскй после этого въезжать вообще не захотелось.
Ayrat
Law 1: return x >>= f behaves the same as f x. new List(x).SelectMany(x => f(x)) ===== f(x)
Ayrat
ну то есть создаём лист из одного элемента и ко всем его элементам применяем функцию, которая должна из них сделать отдельные листы
Ayrat
т.к. элемент в листе один, то нахуя это всё - неясно, можно было сразу сделать f(x)
Ayrat
ОБ ЭТОМ И ЗАКОН
Михаил
Ща, что-то начал на кончиках пальцев чувствовать
Ayrat
SelectMany это bind (fmap)
Ayrat
он принимает функцию x -> List(x)
Михаил
т.к. элемент в листе один, то нахуя это всё - неясно, можно было сразу сделать f(x)
Это типа чтобы не было Option<Option<Option<Option<'a>>>>
Ayrat
то есть a -> M<a>
Михаил
Но я не до конца понял. Это свойство монады? В чём оно выражается? В наличии bind с сигнатурой M<'a> -> ('a -> M<'b>) -> M<'b>?
Антон
unknown plugin звучит как "я не я, и жопа не моя"
Ayrat
монада это некий контейнер над типами с 2мя функциями, которые ДОЛЖНЫ удовлетворять 3м законам (выше)
Михаил
это не св-во, а требование
Окей, понял. А другие два?
Михаил
Да я не всасываю
Ayrat
левая, правая айдентити я тебе копипастну тупо хаскель Law 1: return x >>= f behaves the same as f x. Law 2: m >>= return behaves the same as m. Law 3: (m >>= f) >>= g behaves the same as m >>= (fun x -> f x >>= g).
Михаил
Да я не всосал
Ayrat
Law 2: m >>= return behaves the same as m. List(1,2,3).SelectMany(x => new List(x)) ==== List(1,2,3)
Ayrat
элиминтарщина же
Andrew
Law 2: m >>= return behaves the same as m. List(1,2,3).SelectMany(x => new List(x)) ==== List(1,2,3)
Ну вот это в разы проще понять чем через то что ты выше описал честно говоря
Andrew
Вот даже если знаком с этим
Михаил
А я не понял разницу с первым.
Ayrat
А я не понял разницу с первым.
Law 1: return x >>= f behaves the same as f x. Law 2: m >>= return behaves the same as m.
Ayrat
:D
Ayrat
но ты почти угадал. они называются ЛЕВОЕ айдентити и ПРАВОЕ айдентити
Ayrat
типа с какой стороны ни поставь RETURN от FMAP, должна быть одна хуйня
Ayrat
В теоркате это красивее выглядит даже чем на хачкеле
Михаил
Вчитался внимательнее и кажется немного догнал
Ayrat
Вчитался внимательнее и кажется немного догнал
ну если код на псевдосишарпе кажется понятным, то должно быть ок
Ayrat
если там Лист заменить на Таск/Async/Option/Result, то законы те же
Михаил
Давай для третьего пример на твоём псевдосишарпе
Ayrat
(а может и не придётся поправлять)
Михаил
ЫЫЫ
Михаил
Ну дай мне пару минут
Михаил
list.SelectMany(f).SelectMany(g) list.SelectMany(x -> f(x).SelectMany(g))
Ayrat
ага
Михаил
охуеть
Ayrat
Law 3: (m >>= f) >>= g behaves the same as m >>= (fun x -> f x >>= g). List(1,2,3).SelectMany(x => f(x)).SelectMany(x => g(x)) ===== List(1,2,3).SelectMany(x => f(x).SelectMany(y => g(y))) во втором примере селектМени применяется к результату f(x) сразу же. Списки конечно же получатся одни и те же. Здесь очень важный закон последовательности вычислений в монадическом коде. Потому что монады это императивщина
Михаил
Охуеть. Я монаду понял
Ayrat
ну в общем, да, они простые. Как моноид в категории эндофункторов
Михаил
Ну всё, пойду подкручу ожидаемую зарпалату на хх.
Михаил
ну в общем, да, они простые. Как моноид в категории эндофункторов
Есть ссылка, в которой объясняют слова "в категории эндофункторов"? Интересно теперь и умные слова почитать.
Ayrat
Есть ссылка, в которой объясняют слова "в категории эндофункторов"? Интересно теперь и умные слова почитать.
ну да, в теории категорий. Функтор это "функция" которая мапит категорию в категорию. Эндофунктор просто мапит в ТУ же категорию (а не в другую). В категории присутствуют только объекты и стрелочки между ними, функтор мапит И объекты, И стрелочки. В программировании категория типов (назовём её T) отождествляет объектам собсно типы, а стрелочкам функции между типами. То есть эндофунктор List должен уметь мапить объекты из категории T в ту же категорию (но в другой объект этой категории. Допустим из типа int в тип List<int>), а стрелочку(функцию) int->string он должен смапить в стрелочку(функцию) List<int> -> List<string> вот собсно и всё про функтор. Это просто особая функция. Над категориями
Ayrat
если нарисовать диаграмму всё становится очень понятно. Поэтому в теоркате любят диграммы с точками и стрелочками
Ayrat
собсно в программировании покуда мы работаем только с категорией типов все функторы будут эндофункторами
Ayrat
Но может тут теоркат дрочеры налетят и поправят меня. Я не знаю какие ещё категории в программировании используются и как выйти за её пределы
Ayrat
а, ну да. про моноид в категории эндофункторов! Представим что у нас есть другая категория, где точки - эндофункторы (собсно почему эта категория и называется КАТЕГОРИЯ ЭНДОФУНКТОРОВ), а стрелочки являются естественными преобразованиями (и тут уже не так просто). И в этой категории все моноиды будут монадами :D
Михаил
Я и это кажется почти понял. Но боюсь, мне уже не заплатят так много, как я о себе теперь думаю.
Ayrat
естественные преобразования это как раз те функции, которые нужны монаде чтобы быть монадой. ну вот твои бинды и прочая хуита