LINUX.ORG.RU

[монады] абстракция или костыль?


0

0

Здравствуйте.

У меня возник вопрос относительно темы топика. Есть ли смысл применения монад в языках, поддерживающих фп, и в чём тут выгода? И соответственно, в чём тогда заключается практический смысл их законов и преобразований, или же это только вписывание состояния с типом и аппликативного порядка вычислений в один язык для красивого соответствия теории?

Ответ на: комментарий от jtootf

> монада - это моноид

Хм. Чисто интуитивно кажется, что у «моноида» с «костылем» общего больше, чем с «абстракцией».

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

Чисто интуитивно кажется, что у «моноида» с «костылем» общего больше, чем с «абстракцией».

а вот не надо было алгебру прогуливать

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

> Хм. Чисто интуитивно кажется, что у «моноида» с «костылем» общего больше, чем с «абстракцией».

Хм. А мне почему-то инуитивней связь между «монадой» и педикулёзом %)

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

>монада - это моноид в категории эндоморфизмов. и ничего более

и что этот *морфизм из категории делает полезного, по сравнению с используемыми приёмами в программировании? вроде же об этом с самого начала спрашивал. Например, зачем нужны циклы в структурном программировании понятно, зачем нужны системы объектов тоже понятно, зачем нужны замыкания тоже ясно, зачем нужны треды тоже, зачем нужны исключения - ясно, зачем продолжения - ясно, зачем рекурсия - ясно, зачем макросы - ясно и т.д.

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

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

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

вот здесь и кроется отличие кодера от программиста.

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

В чем недостаток ортогональности возможностей языка? А то что-то необходимость во всяких морфизмах для хеловорда не внушает доверия.

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

ясно

ну если тебе всё и так ясно, зачем ты сюда пришёл? перечисленные тобой асбтракции в массе своей заметно сложней монад

никто толком ничего сказать не может

http://nponeccop.livejournal.com/156763.html

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

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

старые добрые счёты тебе тоже внушают больше доверия, чем компьютер?

jtootf ★★★★★
()

Не костыль. Поскольку список тоже монада, возможны всякие такие вещи:

triangles max = do
    a <- [1..max]
    b <- [a+1..max]
    c <- [b+1..max]
    if a*a + b*b == c*c then [(a, b, c)] else []
    
main = do
    print $ triangles 10

Вывод: [(3,4,5),(6,8,10)]

И главное, что это все достигается стредствами языка. То есть списки такое умеют не потому, что это захардкодили в язык и можно делать свои монады.

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

> Не беспокойся, по количеству кривых костылей Haskell за Lisp никогда не угонится. ;-)

Таки што вас беспокоит, Рэбе?

mv ★★★★★
()
Ответ на: комментарий от Waterlaz
triangles max = do 
    a <- [1..max] 
    b <- [a+1..max] 
    c <- [b+1..max] 
    if a*a + b*b == c*c then [(a, b, c)] else [] 
     
main = do 
    print $ triangles 10 

Это точно не педикулёз?

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

>ну если тебе всё и так ясно, зачем ты сюда пришёл

эээ, ну даже и не знаю что тут сказать. вы все такие?

http://nponeccop.livejournal.com/156763.html

там тоже нет ответа на вопрос. ссылка на кучу книг ответом не является.

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

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

Твой вопрос не имеет смысла. А зачем нужна математика?

Если тебя сабж интересует непосредственно к программированию, почитай публикации Moggi et al. А дальше по ссылкам.

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

>И главное, что это все достигается стредствами языка.

А что достигается в данном примере, измерение кол-ва сахара на строку языка? Я вообще НЕ про хаскелл скрашивал. Ничего похожего на обычные функции из ФП в примере не увидел.

То есть списки такое умеют не потому

Похоже на обычное сравнение в цикле/рекурсии... только не очень ясно точно как и в каком порядке вычисляется условие и строиться результат.

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

>Если тебя сабж интересует непосредственно к программированию, почитай публикации Moggi et al. А дальше по ссылкам.

да, ещё раз, написал же об этом.

А зачем нужна математика?

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

почитай

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

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

> А почему же никто не может сказать сам, что полезного в этом

А ты хотел, чтобы хаскеляторы сказали «ну все остальные способы натянуть В/В на чистый ФП-язык были еще угребищнее»? :)

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

> Вам таки шото не нравится?

Нет, что ви, что ви. П'госто сп'гашиваю, таки на всякий случай...

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

> почему же никто не может сказать сам, что полезного в этом

Потому что пока ты сам не поймёшь, пользы от определения тебе никакой не будет. И конкретные примеры монад тебе ничего не дадут - слишком абстрактны монады для этого. Хочешь в этом разобраться - почитай, к примеру, typeclassopedia - там ясным языком порядку расписано, что, куда и зачем. Не хочешь - тогда прекрати обсуждать непонятные тебе вещи и выставлять своё незнание напоказ. Про язык Blub слышал когда-нибудь?

нравиться

А это я даже комментировать не буду

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

А что достигается в данном примере, измерение кол-ва сахара на строку языка?

Сахар там только в конструкции do. Все остальное НЕ сахар =)

Я вообще НЕ про хаскелл скрашивал.

Ну и? Ты справшивал про программирование? Если да, то где ж еще показывать примеры монад, как не в хаскеле?

Ничего похожего на обычные функции из ФП в примере не увидел.

=) Да функции там обычные. Если так будет проще, то вот (обычные функции):

triangles max =  
    [1..max] >>= \a -> 
    [a+1..max] >>= \b -> 
    [b+1..max] >>= \c -> 
    if a*a + b*b == c*c then [(a, b, c)] else [] 

Записано одно и то же.

Похоже на обычное сравнение в цикле/рекурсии...

Я надеялся, что будет понятно, чем это принципиально отличается от цикла/рекурсии.

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

Ничего похожего на обычные функции из ФП в примере не увидел

если ты понимаешь, зачем в «обычных функциях из ФП» композиция и id, то ты должен без труда понять и то, зачем нужны монады

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

про циклы можно многое сказать в нескольких предложениях

ну так скажи, подай пример

почему же никто не может сказать сам, что полезного в этом

потому что все под таким впечатлением от твоей толстоты, что потеряли дар речи

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

моноид в категории эндоморфизмов

эндофункторов, вообще говоря

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

>Если да, то где ж еще показывать примеры монад, как не в хаскеле?

На каком-нибудь всем понятном синтаксисе, не?

Записано одно и то же.

интуиция мне подсказывает, что это что-то вроде смеси замыканий и мапов, правда тогда этот алгоритм будет говном, которое будет тестировать все возможные комбинации, со сложностью N^3. Даже интуитивно видно, что можно область поиска можно сократить. Не стал сразу этого писать, поскольку синтаксис хаскелла практически не знаю. Суть примера тогда в автоматическом сборе результирующего списка?

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

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

>если ты понимаешь, зачем в «обычных функциях из ФП» композиция и id,

композиция - n последовательных вызовов функции с возвращаемыми значениями в качестве аргументов следующей. ид - аргумент в результат. полезно в рантайме для hof, когда нужно либо скомбинировать «эффект», либо полное его отсутствие, а нужен всего один функциональный аргумент, например во всяких мапах. сойдёт?

зачем нужны монады

ну и зачем?

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

>ну так скажи, подай пример

зачем? это всем очевидно, в отличии от монад. ну, может завтра вечером и напишу, если тут совсем туго будет...

потому что все под таким впечатлением от твоей толстоты, что потеряли дар речи

какая ещё толстота? про монады вообще почти никто не слышал, даже о связи с программированием не подозревают.

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

На каком-нибудь всем понятном синтаксисе, не?

а это какой?

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

>Не хочешь - тогда прекрати обсуждать непонятные тебе вещи и выставлять своё незнание напоказ.

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

Про язык Blub слышал когда-нибудь

нет, но ведь это к же к теме не относиться.

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

композиция - n последовательных вызовов функции с возвращаемыми значениями в качестве аргументов следующей

зачем здесь n? n = 2 недостаточно?

полезно в рантайме для hof, когда нужно либо скомбинировать «эффект»

при чём здесь hof, и что такое «эффект»?

ну и зачем?

затем же. вместо композиции у тебя bind, вместо id - return; а логика выполняемых действий (control flow) - программируется

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

>Про язык Blub слышал когда-нибудь?

И ещё, не все фичи совместимы. Пример: C++. Те. не все концепции можно совместить, и среди них есть плохие и/или не универсальные. Другая концепция не обязательна будет более удобной и абстрактной. Пример: никто так и не сказал ничего толком о монадах и их реальной пользе.

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

>при чём здесь hof,

пример.

и что такое «эффект»?

например, два предиката.

затем же. вместо композиции у тебя bind, вместо id - return; а логика выполняемых действий (control flow) - программируется

может быть, но не в 3 ночи.

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

зачем? это всем очевидно, в отличии от монад

когда кто-то говорит «всем очевидно», это, как правило, означает «я не знаю». очевидную всем композицию ты уже объяснил каким-то диким образом; я всё же настаиваю на объяснении цикла

какая ещё толстота?

феерическая. прозреваю лиспотролля, но доказать не могу

про монады вообще почти никто не слышал

тогда откуда вопрос?

о связи с программированием не подозревают

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

и походу ты не тролль, да?

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

пример.

пример для монад - локальное состояние функции (аналог локальных статических переменных в C++), обработка множественных значений, комбинаторный парсер

может быть, но не в 3 ночи.

http://en.wikipedia.org/wiki/Monad_(functional_programming)

ну тогда почитай вот это днём. там в конце много ссылок

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

Пример: никто так и не сказал ничего толком о монадах и их реальной пользе

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

не все концепции можно совместить, и среди них есть плохие и/или не универсальные

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

jtootf ★★★★★
()

Тебя интересует, зачем нужны монады? Это, вроде бы, просто - монада это конвеер. Монады нужны, чтобы организовывать императивную последовательность действий в ФЯ.

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

>Тебя интересует, зачем нужны монады? Это, вроде бы, просто - монада это конвеер. Монады нужны, чтобы организовывать императивную последовательность действий в ФЯ.

Ну... вот вроде бы и да, но не только =)

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

Это только монада IO, есть ещё много других. В треде, кстати, есть пример использования монады, о последовательности действий в которой я бы предпочёл не думать %). И, кстати, кроме монад есть ещё другие способы организовывать императивность.

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

может быть, но не в 3 ночи.

http://blogs.msdn.com/wesdyer/archive/2008/01/11/the-marvels-of-monads.aspx

несмотря на б-гомерзский сайт, монады здесь вводятся как раз переходом от моноида на множестве функций - т.е. от композиции функций и id

jtootf ★★★★★
()

> Есть ли смысл применения монад в языках, поддерживающих фп, и в чём тут выгода?

Есть. Выгода в простоте, понятности, лаконичности, расширямости, ну и далее по тексту (выгода обычно приводится при сравнении с чем-нибудь, а пока не с чем сравнивать, ты ничего не привёл.)

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

Кроме стейта есть ещё замечательные своей простоте вещи. Если ты знаешь, что такое эксепшны и зачем они нужны - то посмотри на монаду Maybe. Всё красиво, просто и полностью прозрачно, и нет зависимостей от рантайма.

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

Реальная польза монад в том, что они позволяют спрятать «под коврик» ненужные детали реализации и сократить объем кода.

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

Не, это не лиспотролль, у лисперов, в основном, претензии к статической типизации.

eugine_kosenko ★★★
()

Абстракция. Есть много интересных применений и не только в хаскеле. В F# они называются computation expressions или workflows. На базе монады continuation строится механизм асинхронных вычислений (the async workflow). Ничего подобного в других языках (общего назначения) даже близко не видел. С такой легкостью задаются сложнейшие параллельные и асинхронные вычисления! Есть что-то подобное для C# от самого Рихтера, но там такие костыли из делегатов, что страх божий.

Но если ты не знаешь хаскеля, то обсуждать как бы особо нечего. Стандарт де-факто функционального программирования.

dave ★★★★★
()

> Есть ли смысл применения монад в языках, поддерживающих фп, и в чём тут выгода?

Есть ли смысл применения цикла for в языках, поддерживающих while, и в чём тут выгода?

Miguel ★★★★★
()

Вот тут хорошо написано, по-моему:
http://lisp-univ-etc.blogspot.com/2009/11/blog-post.html

Касательно костыль это или нет - ну, судя по тому, что надобности в их использовании в других языках не видится(хотя, например, Maybe в CL есть, это просто-напросто n-арный оператор and короткого цикла), монады в явном виде, т.е. как в хаскеле - таки костыль.

Love5an
()

Вообще, я не врубаюсь, чего все так зациклились (или по-хаскельному нужно сказать «зафиксились»?) на монадах? Почему не задают аналогичный вопрос про, скажем, аппликативные функторы? Или про функцию fix?

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

Потому что про монады сейчас не слышал только слепоглухонемой ленивец на северном полюсе, а про аппликативные функторы знают только функциональщики, да и в самом хаскелле их недавно стали использовать

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