LINUX.ORG.RU

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


0

0

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

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

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

>никак

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

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

> ещё нужно доказать, что собственная монада - это монада, т.е. выполняются условия

Верно. К счастью, обычно это достаточно несложно сделать (либо просто увидеть).

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

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

Насколько я понимаю, то ещё нужно доказать, что собственная монада - это монада, т.е. выполняются условия

equational reasoning. берёшь и проверяешь. на всяким случай запускаешь QuickCheck, и ещё раз проверяешь

Инкапсулировать многое можно и без этого, тогда в чём же смысл?

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

хотя на альтернативные варианты чисто функционального State я бы посмотрел

jtootf ★★★★★
()

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

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

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

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

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

>просто один из инструментов

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

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

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

не понял. что значит «выделять в отдельный вид»?

С прочими понятиями из хаскелла стрелками функторами тоже самое?

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

просто в Haskell для них есть классы типов, а в других языках - нет. и соответствующих плюшек, стало быть, тоже

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

не ясно из контекста?

нет

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

да, для строгих полей в ADT. нет, не так

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

т.е. нужно использовать комбинаторы( какой-там Y,T?) для рекурсивных лямбд, вместо определения в локальном окружении?

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

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

ну типа того, наверное. хорошо, что монады - практический инструмент :)

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

> Кстати, касательно жадности.

В смысле, энергичности?

Ведь для её реализации есть в хаскелле спец. оператор?

seq

Но его лучше не использовать

Иногда полезно.

конструктором( который может быть бесконечным)

Що имеется в виду?

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

>>Хм, и хаскел тут что-то сократит? Как?

без понятия, но только куда там в монаде пропал треугольник (1,1,1)?

Что вы хотели что-бы хаскел сократил?

И что это за треугольник такой?

1*1 + 1*1 не равно 1*1

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

>И что это за треугольник такой?

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

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

>Що имеется в виду?

как-то смотрел на хаскелл, там вроде список может быть бесконечным. система типов это никак не ловила.

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

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

может быть стоило бы развернуть?

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

>как-то смотрел на хаскелл, там вроде список может быть бесконечным. система типов это никак не ловила.

А как это система типов должна была ловить? Просто из определения типа список ясно, что он может быть бесконечным

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

>>Блин, может вы все-таки пойдете и выучите хаскель?

Зачем?

Что-бы понять, зачем нужны монады?

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

как-то смотрел на хаскелл, там вроде список может быть бесконечным

может. в SICP'е вон целая глава посвящена тому, как его сделать, а тут он просто-таки из коробки

система типов это никак не ловила

а что, должна?

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

>т.е. не все теоретические инструменты нужны на практике, а иногда и вредны

Т.е. не все теоретические _уже_ нашли область своей «практической» применимости. И тем более «популяризовались» до сравнимого с «монадами» уровня.

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

> там вроде список может быть бесконечным

Список может, речь шла про какой-то «бесконечный конструктор».

система типов это никак не ловила.

А что тут ловить? Это не ошибка.

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

>Т.е. не все теоретические _уже_ нашли область своей «практической» применимости.

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

И тем более «популяризовались» до сравнимого с «монадами» уровня.

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

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

И как тут выяснилось - монады скорее фича языка

внезапно. вот, оказывается, что мы тут выяснили :)

принципиально новая абстракция

да в этом мире вообще ничего нового нет

реальную пользу по сравнению с существующими

ни одного сравнения в треде не было - так и не определились, с чем же всё-таки сравнивать

даже пропагандисты монад не особо следят за строгостью монад

ну покажите мне хоть одного пропагандиста монад, ну. что это за мифический зверь такой, и как он должен следить за их строгостью?

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

>А что тут ловить? Это не ошибка.

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

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

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

монады скорее фича языка

и как бы там ни было, но монады - не фича языка в Haskell. фича языка - классы типов, а класс монады - всего лишь одно возможное использование этой фичи. так-то!

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

Ошибка - печать или вычисление длинны такого списка фактически не определены

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

http://geekrant.wordpress.com/2008/06/23/misconceptions/

для себя сделал вывод

я думаю, никто в этом и не сомневался ;)

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

> Ошибка - печать или вычисление длинны такого списка фактически не определены

Определены, они равны (_|_).

они определены только для правильных списков

Бесконечный список - правильный.

Например, если ноль удобнее тестировать отдельно/динамически по диапазону, то списки по типу.

По-русски можно?

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

Напрасно.

хватит обычных hof

Монада - и есть частный случай hof, долго ещё объяснять?

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

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

Ну и как ты предлагаешь разделить по типу списки? Нельзя на этапе компиляции узнать, будет ли список бесконечным.

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

ЗЫ и впрочем можно сделать строгие списки, которые будут себя вести так, как в лиспе. Но вот надо ли?

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

>> ЗЫ и впрочем можно сделать строгие списки, которые будут себя вести так, как в лиспе. Но вот надо ли?

Надо.

Зачем?

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

> И как тут выяснилось - монады скорее фича языка, нежели принципиально новая абстракция, которая даёт реальную пользу по сравнению с существующими.

Кто выяснил? Я уже писал в этом треде. Смотри на async workflow из F#. Совершенно другой и непохожий язык. Офигительная функциональность для асинхронных вычислений. Та же самая монада. Точнее разновидность монады continuation.

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

> Это вообще, если на то пошло, не функция. Это значение типа IO (). Вычисляемое ленивым образом.

Ну, да. Конечно, с ленивостью это будет значением. Но последнее время практиковался на F#. А там ленивость имитируется энергичной функцией :: () -> a. Схожая семантика. И лисперу должно быть понятней :) Я так думал во всяком случае. Надеялся... Раньше.

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

>некоторые теоретические инструменты нужны только для теории. непрактичны они.

Не поминай «∄» всуе! Истины в твоей фразе только на: лично ты и именно сейчас не представляешь, как получить «реальную пользу» от «этого» инструмента.

И как тут выяснилось - монады скорее фича языка, нежели принципиально новая абстракция,

Конечно, не новая. Оно, скорее всего, старше нас с тобой (:возможно даже вместе:). И «практически применяется» в программировании оно дольше, чем многие тут присутствующие программируют. Какая ж тут новизна.

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

Гы.
Опять двадцать пять. Ну и покажите же плюсы и реальную пользу от этой «абстракции» в практическом приложении.

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

>и тут же закончились. жаль

А какие, собственно, основания не согласиться с тезисом?
Я там конкретно написал оговорку
[code]В том или ином виде есть и в сях, и вон в хаскеле. Другое дело, что где-то кроме лиспа, и, вообще, языков с концепцией code-as-data(хотя, конечно, из таких языков более-менее живы только лиспы(не надо про форт только, там другое)), они смотрятся убого, но это другое дело.
[/code]

const, readonly, idempotent, mutable - ключевые слова из нефункциональных языков, описывающие различные виды ограничений на сайд-эффекты. ни один из этих языков не является ленивым


Из всех этих слов ни одна ничего не гарантирует, и ни в чем не помогает, это syntactic obstacles, не более. Особенно const, если имеется ввиду C++.

что-то поменялось? да ничего

Ну дык, а о чем тред то, еще раз? Я пример, хм, крутости, лиспа я даже привел вон.

у процедур нет преимуществ. у классов нет преимуществ. у System-F нет преимуществ. и у динамического рантайма, очевидно, тоже нет преимуществ. по твоей логике мы живём в мире из сплошных костылей

В том то и дело, что и у процедур, и у классов, и у всего перечисленного преимущества(перед отсутствием оного, ага) как раз есть, еще раз.

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

>Черт, я все понял. Человек начитался Луговского и вот теперь пожалуйста.
Бла-бла-бла. Нашел универсальный аргумент, да?
Я его иногда понимать начинаю - сложно спорить без грубых выражений с людьми, которые то ли не врубаются совершенно в твои посты, то ли делают вид(и неизвестно еще, что хуже).

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

Какое-то узкое понимание «что».
Под наукой я тут имею ввиду фундаментальную науку.

Фундаментальная наука это вид познавательной деятельности. Она изучает объекты и явления, просто изучает и использует полученные знания для дальнейшего изучения окружающего мира. И она ничего совершенно не говорит о том, что с ними потом делать(т.е. «КАК»). Этим занимается прикладная наука(т.е. «инженерия»; хотя, конечно, можно это трактовать как не совсем одно и то же).

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

>ни однО ничего не гарантирует, и ни в чем не помогает

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

>А пример, хм, крутости, лиспа я даже привел вон.

ночью не спал

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

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

Поверь, Луговский тебя бы первого тут закопал =)

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

А какие, собственно, основания не согласиться с тезисом?

с тезисом вида «макросы фича языконезависимая, но сильно зависит от языка»? не смешно

Из всех этих слов ни одна ничего не гарантирует, и ни в чем не помогает, это syntactic obstacles, не более

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

впрочем, если ты считаешь это syntactic ocbstacles, то говорить с тобой о статически типизированном языке любого вида - бесполезно

Я пример, хм, крутости, лиспа я даже привел вон

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

В том то и дело, что и у процедур, и у классов, и у всего перечисленного преимущества(перед отсутствием оного, ага) как раз есть, еще раз.

у инкапсуляции есть достоинства? у абстракции данных и процедур есть достоинства?

использовнаие монад - подход к инкапсуляции, абстракция данных (как в случае Reader, Writer, State) и вычислительного процесса (как в случае List или Omega). если ты считаешь, что у процедур есть достоинства, а у монад - нет, то ты противоречишь сам себе

в очередной раз, ага

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

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

о да. исключительно ЛОРовская закалка заставляет меня сдерживаться

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

>покажите же плюсы и реальную пользу от этой «абстракции» в практическом приложении

В абстрактном вакуумно-сферическом приложении?

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

>>покажите же плюсы и реальную пользу от этой «абстракции» в практическом приложении

В абстрактном вакуумно-сферическом приложении?

При чем что характерно, хаскель он не знает и любой пример на нем автоматически отправит в /dev/null, ибо ваистену.

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

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

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

Т.е. на хаскеле кода не пишут?
А если и пишут, то левым пальцем правой ноги, и объяснить чего написали, и что оно делает, не могут? :)

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