LINUX.ORG.RU

Продайте мне Хаскель

 


3

3

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

Абстракция или костыль?

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

Вот можно поподробнее об этом, не применяя слова «монада» или «функтор». А простым Русским языком. То есть, допустим, я разрабатываю бухгалтескую программу, или веб-сайт, или среду разработки. И например, я так могу объяснить некоторые фичи из языков с точки зрения полезности для пользователя:

  • RAII нужна мне для того, чтобы при любой ошибке в программе мой файл отчёта закрывался, а не оставался захваченнным, что повлечёт проблемы для других пользователей.
  • Замыкания мне нужны для того, с минимальными усилиями сохранять состояние клиентского приложения во время, пока я жду ответа от веб-сервера, не создавая на каждый запрос к серверу новый объект данных.
  • Сборка мусора нужна мне для того, чтобы не заботиться об удалении каждого объекта, который я создал, а заботиться лишь о некоторых, и чтобы при этом моя программа не падала из-за ошибок обращения с кучей и не жрала лишнюю память.
  • call/cc мне нужен для того, чтобы реализовать в моей IDE инкрементную раскраску файла.
  • code walker мне нужен для того, чтобы реализовать call/cc там, где его нет, например, на лиспе.

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

Вот мне нужно объяснение в том же стиле, а что такого хорошего умеют делать монады. Я уже знаю, что монады позволяют отделить чистое от нечистого. Но они явно должны уметь что-то ещё. Так вот, что они умеют ещё? Но по сути, а не без самого слова «монады», без ссылок на сто книжек, без дзен, и без слов, что я сначала должен изучить хаскель. Т.е., без сектоводства, а чисто по делу.

Допустим, если вы знаете 5 применений монад (кроме оформления императивности), то достаточно 5 фраз.

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

И, на всякий случай напомню, что мы с тобой говорили про cont-монаду и do-синтаксис в треде про хаскель. До того момента, как ты перешёл к утверждениям про «все языки» с нативным call/cc и коду на схеме. Дальше продолжать, наверное, не стоит.

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

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

Но я понимаю. Видимо, с пониманием проблемы у тебя.

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

И, на всякий случай напомню, что мы с тобой говорили про cont-монаду и do-синтаксис в треде про хаскель.

Нет, не говорили. Автор спросил, зачем нужны монады, я ответил, что в языке с call/cc они абсолютно бесполезны (объяснение, почему - приведено в предыдущем посте) - и это вполне релевантный ответ, учитывая, что автор вполне такие языки использует. А потом уже у тебя подгорело и ты вперся со своей нелепой икспертизой.

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

Весь код в любом языке с call/cc является монадическим автоматом (в identity монаде). Без переписывания в do-нотацию, замены аппликаций на бинды и прочую чушь.

Именно по-этому получается в do-нотации записать любую другую монаду - do-нотация внутри cont является таким языком.

Точно так же, как ты в хаскеле превращаешь код внутри do в код любой монады - в языках с call/cc ты можешь делать _с произвольным_ кодом. В любом месте.

Анонимус практически продал мне схему. Поскольку идентичность анонимуса никоггда не ясна, я считаю ответы анонимусов несколько... э... не заслуживающими доверия, даже если они выглядят похожими на правду. Я бы хотел комментариев от зарегистрированных пользователей, знающих Хаскель. Верно ли я понял, что в Хаскеле нельзя так просто взять определённый уже написанный код и как-то по-новому его выполнить (добавить к нему транзакционность, к примеру, или call/cc). Я ищу именно такую возможность (у меня есть конкретная задача для этого).

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 2)
Ответ на: комментарий от den73

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

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

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

Проблема в том, что универсальная = бесполезная.

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

как работает подсознание

не совсем согласен: универсальная = не совсем бесполезная (просто покамест ещё «полезная непонятно где» — полезная модель, теория, исчисление непонятно где применимая, пока не построен специализатор через проекции Футамуры :-).

мысль же работает по-разному: индуктивно или дедуктивно. и «интуиционисткая» логика по идее, должна более задействовать подсознание (нагруженное какими-то сегментами, звеньями цепи — кусками знаний, теорий, моделей) чтобы из них состыковать композиционную денотационную семантику, теорию решёток, модель акторов (или даже ниже «The Timed Diagrams Model», где время — введено «локальное собственное время, внутри продолжения или там монады»), вот это всё.

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

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

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

для монад арифметики нет

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

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

Нужны конкретные монады

да. для чего эту конкретность полезно определить прежде чем/после чем искать (задав ту же денотационную семантику, например).

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

но при этом совершенно незачем знать, что они являются монадами

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

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

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

то есть, сохраняет целостность (в смысле конкретной модели, монады).

то есть, композиционность (в смысле денотатов денотационной семантики из различных «кинематических» :-) звеньев общей схемы) и синтез моделей.

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