понедельник, 21 октября 2013 г.

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

В частности по мотивам - http://18delphi.blogspot.ru/2013/07/blog-post_9746.html
Более "правильное" недавнее обсуждение - может быть Роман Янковский напомнит ссылку.

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


Монада это "точка с запятой" :-)


Смешно наверное. Но именно эта метафора натолкнула меня на "путь понимания". Спасибо её автору.


Монада - это НЕ ФУНКЦИЯ и НЕ СПОСОБ конструирования ФУНКЦИЙ.


Монада - это "императивная надстройка" над "чистой функциональностью".


Монада - это "шаблон проектирования" (спасибо Роману Янковскому) позволяющий из "чистых функций" КОНСТРУИРОВАТЬ "функционал".


Монада - это цепочка "чистых функций".


Моднада конструктивно находится НАД функциями.


Монада позволяет ОПРЕДЕЛИТЬ "контекст" тех функций, которые она "связывает".


В этом смысле функции служат для монады "лямбдами". Хотя это наверное - "масло масляное".


Функции НЕ ОПИРАЮТСЯ на монады. А монады связывают функции в цепочки.


Монаду НЕЛЬЗЯ кешировать или параллелить. Кешировать или параллелить можно лишь функции, которые связывает монада.


Нет ФУНКЦИИ чтения из файла. Есть монада, которая читает из файла и передаёт результат чтения в "связанные" функции.


Нет ФУНКЦИИ записи в файл. Есть монада, которая берёт результат работы "связанных" функций и записывает в файл.


Нет ФУНКЦИИ Random. Есть монада, которая берёт значение генератора случайных чисел и передаёт его АКТУАЛЬНОЕ значение в "связанные" функции.


Нет ГЛОБАЛЬНЫХ ПЕРЕМЕННЫХ, есть монада, которая читает значение из "слота памяти" и передаёт в "связанные" функции. Аналогично - есть монада, которая берёт результат "связанных" функций и кладёт его в "слот памяти".


Т.е. в "широком смысле" - монада - это средство порождения КЛАССА ФУНКЦИЙ, параметризуемых ВНЕШНИМ КОНТЕКСТОМ. Который определяет монада.


И все "вкусности" функционального подхода работают лишь ВНУТРИ функций. Может быть "связанных" монадами.


Поправьте меня, если я неправ.


P.S. Особенно мне понравилась метафора Янковского - "если бы я рассказывал бы функциональщику, что такое объекты - я бы начал бы с понятия лямбд".


P.P.S. Нашёл кстати тут

http://dic.academic.ru/dic.nsf/enc_philosophy/753/%D0%9C%D0%9E%D0%9D%D0%90%D0%94%D0%90

" МОНАДА (от греч. μονάς, родит, падеж μονάδος — единица, единое; лат. monas) — неделимое несоставное единство, мера и прообраз числа. Монада — начало бытия, материей которому служит другое, “неопределенная двоица”, диада (Диог. Л. VIII 25); но материю можно считать также ее аспектом. С монадой связана проблематика неделимой несоставной точки (там же, III 107; Аристотель. “Метафизика”, Χ l, 1953a 27; XIV 2,1089b 25; Марциан Капелла К)"


Только "исходя из того, что я понял" - МОНАДА (в функциональных языках) - вполне себе ДЕЛИМА.


P.P.P.S. Кстати и тут - http://18delphi.blogspot.com/2013/10/blog-post_21.html


Написано вот что:

"Монада это не дополнительное понятие. Это такое же понятие как "коллекция", "итератор", итд. А помогает она тем, что может просто описать императивность, последовательность действий. Но именно описать, а не совершить."

И ещё - "Обычно соединение монады и монадической функции выглядит так: после того как будет выяснено значение монады, оно будет передано функции, которая вернёт ещё одну монаду. А там они уже радостно соединятся как монада - монада. =)
Монадическая функция служит только для создания монады."


-- вот это вроде "о том же", но уже не вяжется с "моим пониманием".

Я вот это "оно будет передано функции, которая вернёт ещё одну монаду" - не понял.

P.P.P.P.S. Даже если я ВСЁ ПОНЯЛ НЕПРАВИЛЬНО - всё равно - я теперь знаю как "в байтах" написать собственный "функциональный язык". Если вдруг понадобится.

2 комментария:

  1. Ссылку напоминаю: http://juick.com/Kerk/2555063

    ОтветитьУдалить
  2. >Монада - это "императивная надстройка" над "чистой функциональностью".

    Монада может помочь в описании последовательности действий, но это не обязательно. Есть множество монад, служащих для других целей.

    >Монада - это цепочка "чистых функций".

    Есть такие монады, а есть и другие. =)

    >Я вот это "оно будет передано функции, которая вернёт ещё одну монаду" - не понял.

    Оператор >>= склеивает монаду и монадическую функцию(т.е функцию, возвращающую монаду), возвращая монаду. Первая монада содержит значение, необходимое для получения монады из монадической функции(исполнив её). Таким образом после вычисления значения первой монады, оно передастся в функцию, которая вернёт монаду. Теперь первую монаду можно соеденить с получившейся второй.

    ОтветитьУдалить