LINUX.ORG.RU

Где тут монады?

 ,


0

3

На фоне моей заинтересованности ФП, начал смотреть лекцию Крокфорда по использованию монад в JS.

http://www.youtube.com/watch?v=b0EF0VTs9Dc

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

Он там утверждает, что многие AJAX-либы, жеквери, и многие другие, используют монады. Приводит там свою какую-то задрипанную либу. Проще говоря, он утверждает, что код в стиле жеквери, типа,

new O()
 .doStuff()
 .doAnotherStuff(arg)
 .dosmth() // etc
использует монады.

Возник вопрос: с какого хрена? Такой код на JS реализуется тривиально. Может кто знает, где он там монады нашел?

Я тут Лейбницом по диагонали обмазываться начал, так оказывается, «монады» — это он ввел в такое широкое употребление, совсем древние до него очень редко использовали.

redhat
()

Очевидно, что здесь есть композиция предположительно нечистых функций, следовательно — монады

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

хотя я приблизительно догадываюсь.

Ну расскажи свои догадки, интересно.

theKingOfJava
() автор топика
Ответ на: комментарий от buddhist

Очевидно, что здесь есть композиция предположительно нечистых функций, следовательно — монады

А можно поподробней? Я не понимаю, откуда там что берется. Во первых, там и композиции функций нет никакой. Я такой код на коленке запилю за 5 минут безо всяких монад. Я же говорю, это тривиальнейшая фигня. Не знаю, может в хаскеле это трудно, в JS это как 2 пальца об асфальт делается. Почему ты думаешь, что для подобного кода нужны монады?

theKingOfJava
() автор топика
Ответ на: комментарий от Debasher

есть

смешной ты.


Div={
 create: function(){
  var o=Object.create(this);
  o.value=document.createElement("div")
  return o
 },
 append: function(){document.body.appendChild(this.value); return this},
 setText: function(){this.value.innerHTML="foo"; return this}
}

Div
 .create()
 .append()
 .setText("Hello!")

Где ты тут увидел композицию ф-ций?

theKingOfJava
() автор топика
Ответ на: комментарий от Debasher

Да нет, отчего же. Я знаю.


compose=function(f1, f2){return function(x){return f1(f2(x))}}
sum=function(x){return x+x}
mul=function(x){return x*x}

sumAndMul=compose(sum, mul)
sumAndMul(3) // 18
вот это композиция. А там ее нет.

theKingOfJava
() автор топика
Ответ на: комментарий от Debasher

Ну ладно, хрен с ней, с композицией. Где тут монады? Конкретно можешь ткнуть, в каком месте они и почему это они?

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

Упрощенно: монада это тройка (F,s,j), где F - функтор, s (return) - поднятие значения в функтор (:: t -> F t), j (join) - объединение F (F t) -> F t. Так же j можно записать как a (>=>) (a -> F b) -> (b -> F c) -> F c, или привычный байнд (>>=) F a -> (a -> F b) -> F b + должны выполняться соотв. законы. Собственно в этих ваших хацкелях монадки нужны именно для bind/join и позволяют сплющивать монадные уровни если нужно передать одно вычисление в другое. Если тебе интересно, то возьми статью Wadler или Tato и прочитай вступление, все будет ясно и понятно. Т.е. монадки это офигенно простая и очевидная математическая вещь.

Теперь про js и зверей, у тебя там есть объект «JQuery(a)» очень похожий на функтор, и есть что-то похожее на композицию ".", т.е. «f . g» есть объект JQuery(f) к нему применяется операция работающая над значением внутри контекста и возвращающая «JQuery(b)», т.е. работающая как байнд. Но! Лично мне не очевидно, что JQuery можно назвать функтором и что законы сохраняются, если ты ответишь на эти вопросы, то получишь и ответ на свой изначальный вопрос. При этом то, насколько это просто или сложно выражается роли не играет. Возможно придётся как хацкель учитывать наличие задницы^W bottom.

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

qnikst ★★★★★
()

ты путаешь монады и гонады.

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

Большое спасибо за ответ. Мне видимо, придется сначала разобраться с функтором:) Не так все просто оказалось. Начал вникать. Взял «простой» пример из википедии.

Я не могу понять, почему, там где в других языках мы делаем все просто, например Io

list(1,2,3,4,5) map (+ 1) # list(2, 3, 4, 5, 6)
Мы должны делать через жопу какой то функтор.
plusOne = (+1)
 
numberList = [1, 2, 3, 4, 5]
 
newNumberList = fmap plusOne numberList
 
-- newNumberList == [2, 3, 4, 5, 6]
что, без него нельзя чтоли?

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

map - частный случай fmap. fmap не только для списков работает.

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

Мы должны делать через жопу какой то функтор.

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

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

Начну конца, без функтора можно, есть мономорфный по структуре map :: (a-> b) -> a -> b. fmap можно назвать его обобщение на любую структуру (в мат. смысле) являющуюся фуктором (на самом деле наоборот map это специализация fmap на списки). Конечно все эти fmap выглядят странно, но тут нужен компромисс, если интересно, то смотри обсуждение foldable traversable proposal в теме про ghc ссылка есть.

Теперь про функторы и их сложность, в упрощенном смысле их можно рассматривать как контейнер (в смысле структуры даннвх) или контекст вычисления, который «захватывает» особенности вычисления будь то эффекты или прочие свойства (напр. Identity не делает ничего :)). Функтор должен иметь операцию применения fmap, которая применяет значение к значению внутри контекста сохраняя его (контекста) структуру, напр. поэтому список это функтор, а множество - нет. Т.е. если у тебя есть контекст (список, maybe, величина с погрешностью, jquery), то ты можешь проверить есть ли у него требуемая операция и дальше ты минимум сможешь применять к нему всякие полиморфные функции, или использовать во всяких композициях, как в lens (см. как линзы строятся). К сожалению, простых и наглядных примеров для второго у меня не подготовлено, т.к. ни преподаванием ни консультациями особо не занимаюсь.

Как-то так.

qnikst ★★★★★
()
Последнее исправление: qnikst (всего исправлений: 1)

Да нигде. Монады — это, прежде всего, типы.

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

Эм, забыл скобки map :: (a -> b) -> [a] -> [b]?

А в каком смысле он мономорфный? В том, что это инъективный изоморфизм из a -> b в [a] -> [b]? Тогда fmap тоже мономорфный.

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

не только ж он прочитает

Да, спасибо. Особенно, когда с ссылками.

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

Мономорфный по ...? Я не уверен, что это не неформальное описание, но мне кажется что такое определение корректно и map является работает только над одним типом структуры т.е. мономорфный по ней,а fmap по любой т.е. полиморфная по ней..

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

Скобки да забыл, когда перечитывал уже поздно исправлять было :(

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

А, понял, мономорфная - не полиморфная.

TIL хаскелисты настолько зажрались, что называют функцию с двумя типовыми переменными мономорфной (не полиморфной) :)

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

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

qnikst ★★★★★
()

Лечись цианидом. Героин тебе явно уже не помогает.

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

В любом случае о данном объекте можно думать как о монадах

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

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

монадкология.

Я тут Лейбницом по диагонали обмазываться начал, так оказывается, «монады» — это он ввел в такое широкое употребление, совсем древние до него очень редко использовали.

да ты гонишь, Лейбниц это тоже не сам по себе первый придумал. он чужое подхватил. прослеживается такая цепочка: «характеры» и «монадология» Лейбница — на основе монад Ди — на основе «образов и мест» искусства памяти Джордано Бруно, герменевтиста, гностика и «христианского мага», художника и скульптора памяти, рисующего в душе и памяти (ср. диалог из «Теней»). искусство памяти Джордано Бруно — естественно основывается на луллизме (Раймонд Луллий), в противовес рамизму (Ramus) и схоластам, «педантам-грамматикам» и «антиаристотелю». далее машина с вращающимися кругами Р. Луллия для «распознавания образов» (наивный байесовский классификатор) через «театр памяти» Камилло и «тени идей» и францисканцы, далее до древней Греции и античности и досократиков — риторов (Федр, симонид и прочие киники, стоики и т.п.).

кстати, пифагоровы тела и многогранники; и платоновы идеи, и идея о том, что единица — основа всего. от этой божественной единицы один шаг до монады как «моноида в категории эндофункторов» и моноида := <множество объектов;нейтральный элемент, или единица моноида; композиция, или умножение в моноиде> .

есть мнение, что платон опять же не сам это придумал. а из египтян (см. диалоги «Тени» и «Печать Печатей» от Джордано Бруно — про «искусство внутреннего письма» ,«письма в памяти» и ругание Тота египетского Гермесом за то, что он изобрёл буквы — в результате чего «педанты-грамматики» разучились думать, и видят только форму схоластов, но не содержание образности. смотрят в книгу, а видят фигу).

читаем про египтян — представляем их учителей, то есть, атлантов, или гипербореев (до раскола на фракции).

Лейбниц же рулез прежде всего по трём причинам:

1. изобретение двоичной системы исчисления и калькулятора.
2. от «единицы как основы всего» двоичной один шаг до единицы моноида и алгебаических многочленов: гиперкомплексных и p-адических чисел; однако этот шаг он не делает, а делает шаг в сторону
3. в сторону «исчисления характеристик» для распознаватора образов и класификатора, а также «энциклопедии в исчислении характеристик» — то есть, по сути — гипертекста


«исчисление характеристик» он не доделывает до ума и полноценной теории котиков категорий; однако на этом пути он изобретает четвёртое
4. всеми нами любимый матанализ через дифференциальное исчисление, вариации бесконечно малых — просто и понятно, а не громоздко и нелепо — как Ньютон Исаак через «исчисление флюксионов».

вообще Ньютон в «математических началах философии, в натуре» пишет как типичный педант-грамматик, схоласт (это его «абсолютное время, в первом, математическом смысле» — например).

это он самый, а также Ф. Бэкон вкупе с Рене Декартом и его «Размышлениями о методе» в ответ на «отчёт о методах искуссвтва памяти», или «отчёт о методе» — виноваты в антиантиаристотилевщене, антидиксоновщине.

в том что «научный метод» схоластов и педантов-грамматиков (рамистов) вытеснил «искусство памяти» Джордано Бруно и «театр теней идей и образов» Камилло.

в том, что теория категорий опоздала в развитии лет на 300 и вместо образности искусства памяти «внутреннего письма» в прикладной метамагии и переносе инвариантов и теорем между когерентными теориями — и в итоге, в вашей альтернативной реальности победил «научный метод» схоластов и метанаука вместо метамагии. в отличие от нашей, где все невозбранно умеют тапать ману.

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

(пруфлинк:)

anonymous
()
Ответ на: монадкология. от anonymous

Короче говоря, именно благодаря изобретению новых «характеров» он получил возможность оперировать исчислением бесконечно малых, которое, однако, было лишь фрагментом, или образчиком его так и не завершенной «универсальной характеристики». Если согласиться с нашим предположением, что лейбницевская «характеристика» происходит из мнемонической традиции, то это означает, что перенесенный в сферу математических символизаций поиск «образов для вещей» привел к открытию новых и более точных математических, или логико-математических, обозначений, сделавших возможными новые типы исчисления. Для Лейбница в исследовании «характеров» всегда было принципиально важно, чтобы характеры как можно более точно отображали реальность, или реальную природу вещей, и некоторые места из его работ проливают свет на основу его поиска. Так, в Fundamenta calculi rartiocinatoris он определяет «характеры» как знаки, написанные, нарисованные или высеченные. Знак тем пригоднее, чем ближе он к определяемой вещи. Однако Лейбниц замечает, что характеры, употребляемые химиками или астрономами, к примеру, те, которые Джон Ди предлагает в своей Monas hierogliphica, бесполезны, как и китайские и египетские изображения. Язык Адама, которым тот именовал творения, был близок к реальности, но мы не знаем его. Слова обычных языков несут на себе печать проклятия, и их использование приводит к ошибке. Единственно наилучшими для точного исследования и исчисления являются notae арифметиков и алгебраистов

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

В тех курсах по истории новой философии, в которых всякий раз повторяется, что термин «монада» Лейбниц заимствовал у Бруно, речь никогда не идет о герметической традиции, из которой Бруно и другие герметические философы эпохи Возрождения извлекали это слово. Хотя Лейбниц как философ XVII века принадлежал иной атмосфере и новому миру, лейбницевская монадология несет на себе ясный отпечаток герметической традиции. Основная функция лейбницевских монад, поскольку они суть души и наделены памятью – выражение или отображение универсума, которого они являются живыми зеркалами62 – образ, очень хорошо знакомый читателю этой книги.

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

векторный гипертекстовый теоркат, куда же без него.

quote]Хорошо известно, что Лейбниц разработал проект под названием «характеристика».47 Перечни должны быть составлены из всех существенных понятий мышления, а этим понятиям должны быть определены символы или «характеры». Влияние на эту схему ведущихся еще со времен Симонида поисков «образов для вещей» очевидно. Лейбниц знал о широко распространенном в его времена интересе к созданию универсального языка символов или знаков48 (проекты Бистерфилда и других), но такие проекты, как уже было указано, сами находились под воздействием мнемонической традиции. И «характеристика» Лейбница должна была стать чем-то большим, нежели универсальный язык, она должна была стать «исчислением». «Характеры» использовались в логических комбинациях так, что в итоге формировалось универсальное искусство, пригодное для разрешения всех проблем. Зрелый Лейбниц, великий математик и логик, все еще прямо исходит из ренессансных попыток объединить классическое искусство памяти и луллизм, размещая образы классического искусства на комбинаторных кругах Луллия.

Совместно с «характеристикой» или исчислением Лейбниц задумывал и проект «энциклопедии», которая могла бы собрать воедино все известные человеку науки и искусства. Когда все виды познания будут систематизированы в энциклопедии, «характеры» будут определены ко всем понятиям, для решения всех проблем в конечном счете будет создано универсальное исчисление. Исчисление, полагал Лейбниц, применимо во всех областях познания и деятельности. Оно способно разрешать даже религиозные затруднения.49 В случае разногласий, к примеру, на Трентском совете, не нужно больше затевать войну, но просто следует сесть рядом, сказав: «Давайте посчитаем».

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

Упрощенно: монада это тройка (F,s,j), где F - функтор, s (return) - поднятие значения в функтор (:: t -> F t), j (join) - объединение F (F t) -> F t.

можно проще: «монада есть моноид в категории эндофункторов» , а затем понятие моноида и : нейтрального элемента, божественной единицы моноида(s); и композиции, (j) — умножения в моноиде. затем говорим про эндофункторы, из самих себя в себя, и про категории. приходим к тому же самому определению что и (F,s,j), к тем же самым bind, и >=> но как-то более конструктивно.

и позволяют сплющивать монадные уровни если нужно передать одно вычисление в другое.

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

anonymous
()

теория категорий помогает в животноводстве

Широка страна моя родная. Куда ни глянь — везде проявляется труд математиков. Зацветают монады на склонах декартовых замкнутых категорий. Колосятся сопряжения функторов. Под мудрым руководством категории категорий идёт строительство абстрактных фабрик паттернов. Звонкий смех пионеров раздаётся в рощах изоморфизмов. Сопрягайся, если хочешь быть здоров!

Не счесть числа приложений теории категорий. Тут тебе и тушение лесных пожаров, и решение транспортной проблемы, и кормление бездомных котят. Теория категорий даст каждому ребёнку по одному лэптопу. Теория категорий накормит голодных, утешит страждущих, разгонит заторможенных, обогреет тех, кто на морозе. Под знаменем копроизведения посвятим свою жизнь теории категорий! Аминь.

anonymous
()
Ответ на: монадкология. от anonymous

как тапать ману

вот здесь, к примеру, во всех подробностиях и достоподробнейше описано о том, как следует невозбранно тапать ману.

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

можно проще: «монада есть моноид в категории эндофункторов» ,

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

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

А что такое «поднятие значения в функтор»? Что это значит?

Это процедура заворачивания значения в этот самый контекст (контейнер) (см. письмо qnikst выше по треду), чтобы дальнейшие действия с ним шли в рамках монады.

Как это происходит?

Для всех по разному (для этих целей в конкретной монаде должна быть определена функция return). Например для списка это просто x -> [x], для Maybe - x -> Some(x).

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