2010-07-16 5 views
26

Можно создать дубликат:
What is a monad?Монада в не-программирование терминов

Как бы вы описали монаду непроизводительные программирования терминов? Есть ли какая-то концепция/вещь вне программирования (вне всего программирования, а не только FP), что можно было бы сказать, чтобы действовать или быть монадоподобным значительным образом?

+31

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

+10

Ehrm, не является ли «монада» уже не-программирующим термином? – sepp2k

+0

Является ли «функтор» не-программирующим термином? Я помню, что у меня был момент «ага», когда я понял, что они просто специальные функторы. –

ответ

24

Вот мой текущий удар в нем:

Монады ковшеобразные бригадами:

  1. Каждая операция является человек, стоящий в очереди; то есть есть однозначная последовательность, в которой происходят операции.
  2. Каждый человек берет одно ведро в качестве входных данных, извлекает из него материал и помещает в ковш новый материал. Ведро, в свою очередь, передается следующему человеку в бригаде (через привязку, или >>=, операция).
  3. Операция return - это просто операция по размещению материала в ковше.
  4. В случае последовательности (>>) операции с содержимым ведра сбрасываются до того, как они будут переданы следующему человеку. Следующему человеку все равно, что было в ведре, они просто ждут его получения.
  5. В случае с монадами на () билет проходит внутри ведра. Это называется «Единица», и это просто чистый лист бумаги.
  6. В случае с монадами IO каждый человек говорит что-то вслух, это либо глубоко глубокое, либо совершенно глупое - но они могут говорить только, когда держат ведро.

Надеюсь, это поможет. :-)


Edit: Я ценю вашу поддержку, но, к сожалению, проклятие Монада Учебник ударил снова. То, что я описал, является просто функциональным приложением с контейнерами, а не с монадами! Но я не нигилист - я считаю, что проклятие Monad Tutorial может быть нарушено! Итак, вот несколько больше, um, сложное изображение, которое я думаю, это немного лучше. Вы решаете, стоит ли брать его друзьям.

Monads являются ведро бригады с руководителями проектов. Руководители проектов стоят за всеми, кроме первого члена бригады. Члены ведровой бригады сидят на табуретах и ​​перед ними стоят ведра.

Первый человек получает кое-что, что-то делает с ним и кладет его в ведро. Этот человек тогда уходит - не к следующему человеку в бригаде, это было бы слишком легко! :-) - но менеджеру проекта стоит за этим человеком.

Руководитель проекта (ее имя bind, или >>=) принимает ведро и решает, что с ним делать.Она может решиться вытащить вещи из первого лица из ведра и просто передать ее лицу перед ней без дальнейших церемоний (это монада IO). Она может выбросить ведро и закончить бригаду (это fail). Она может решить просто обойти человека перед собой и передать ведро следующему менеджеру в бригаде без дальнейших церемоний (вот что происходит с Nothing в монаде Maybe). Она даже может принять решение вытащить материал из ведра и передать его человеку перед собой за один раз! (Это Монада Список.) В случае последовательности (>>) она просто ударяет плечо лица перед ней, вместо того, чтобы передавать им все.

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

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

() значения, IO-монады и операция return остаются описанными выше.

«Но это слишком сложно! Почему люди не могут просто выгружать ведра сами?» Я слышу, как вы спрашиваете. Ну, менеджер проекта может выполнить кучу работы за кулисами, которая в противном случае усложнила бы работу человека. Мы пытаемся упростить работу этих членов бригады, поэтому им не нужно делать слишком много. Например, в случае Модификации Maybe каждый человек не должен проверять ценность того, что им дано, чтобы увидеть, были ли они даны Ничто - менеджер проекта позаботится об этом для них.

«Ну, если вы снова пытаетесь облегчить работу каждого человека, почему бы не пройти весь путь - попросите человека просто взять вещи и передать материал, и пусть менеджер проекта беспокоится о bucketing? " Это часто делается, и у него есть специальное имя, называемое , поднимающее человека (er, операция) в монаду. Иногда, однако, вы хотите, чтобы у человека было что-то более сложное, где ему нужен какой-то контроль над созданным ведром (например, нужно ли возвращать Nothing в случае монады Maybe), и это то, что монада в полной общности.

Точки являются:

  1. Операции секвенировали.
  2. Каждый человек знает, как сделать ведра, но не как получить материал из ведер.
  3. Каждый менеджер проекта знает, как бороться с ведрами, и как получить материал из них, но все равно, что в них.

Таким образом, заканчивается учебное пособие по постели.:-P

+0

Итак, как бы использовать эту аналогию сделать его проще описать, скажем, 'State' монады' get' и 'put' операции? Или, может быть, монада 'Cont' и' callCC'? –

+0

Это не так: get, put и callCC не являются операциями, относящимися к самой монаде. Эта аналогия заключается в том, что вы получаете класс Monad под одним пальцем и фокусируется на операциях привязки и последовательности, которые лежат в основе каждой монады. –

+0

Просто убедитесь, что вы раздражены: MonadState имеет свою аналогию. В этом случае нет ведер, но есть состояние, которое невидимо передается вдоль ведровой бригады. Get - это человек, который копирует состояние (концептуально) и передает копию состояния. Положите замену государству тем, что он получает, и вырывает пустой лист бумаги. Все остальные игнорируют государство и имеют дело только с тем, что им передают, что является ключевой частью. runState устанавливает все это и возвращает конечное состояние вместе с конечным значением. –

2

Мне нравится думать о них как абстракции вычислений, которые могут быть «связаны». Или, буррито!

3

Ну, вот a nicely detailed description of monads, что определенно вне программирования. Я знаю, что это вне программирования, потому что я программист, и я не понимаю даже половины того, о чем он говорит.

Существует также серия видеороликов на YouTube, объясняющих монады этого сорта - вот the first in the sequence.

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

+2

На самом деле теория категорий имеет много общего с программированием. В том смысле, что космология имеет отношение к астрономии. – Apocalisp

36

Да, есть несколько вещей, вне программ, которые могут быть названы как монады. Нет, никто из них не поможет вам понять монады. Пожалуйста, прочитайте Abstraction, intuition, and the “monad tutorial fallacy”:

Joe Haskeller пытается узнать о монадах. После попытки понять их в течение недели, глядя на примеры, написание кода, чтение вещей, написанных другими людьми, у него наконец есть момент «ага!»: Все внезапно становится ясным, и Джо понимает Монады! Конечно, на самом деле произошло то, что мозг Джо скомбинировал все детали вместе с абстракцией более высокого уровня, метафорой, которую Джо может использовать, чтобы получить интуитивное понимание монадов; предположим, что метафорой Джо является то, что Монады похожи на буррито. Вот где Джо плохо неверно истолковал свой собственный мыслительный процесс: «Конечно!» - думает Джо. «Теперь все так просто. Ключом к пониманию монадов является то, что они похожи на буррито. Если бы я только подумал об этом раньше! »Проблема, конечно же, в том, что если бы Джо подумал об этом раньше, это не помогло бы: неделя борьбы за детали была необходимой и неотъемлемой частью формирования интуиции Джо Буррито , а не печальное следствие его неспособности напасть на эту идею раньше.

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

Как я уже говорил в another answer давно, статье SIGFPE в You Could Have Invented Monads! (And Maybe You Already Have.), а также оригинальная бумага Philip Wadler в Monads for functional programming, оба отличных введения (которые дают не аналогии, но много примеров), но помимо этого вы просто держать кодирование, и в конечном итоге все это будет казаться тривиальным.

[Не настоящий ответ: одно место монады существуют вне всякого программирования, конечно, в математике. Как указывает this hilarious post, «монада - моноид в категории эндофунторов, в чем проблема?» :-)]


Edit: спрашивающий, кажется, интерпретировали этот ответ, как снисходительно, говоря что-то вроде «Монады настолько сложны, что они выходят за рамки аналогии». На самом деле ничего подобного не предназначалось, и это монад-аналоги, что often appear condescending. Возможно, я должен переформулировать свою точку зрения как «Вам не нужно понимать монады». Вы используете определенные монады, потому что они полезны - вы используете монаду Maybe, когда вам нужно. Может быть, типы, вы используете монаду IO, когда вам нужно делать IO, аналогично other examples и apparently in C#, вы используете шаблон Nullable <>, LINQ и запрос понимания и т. д.Теперь понимание того, что существует общая абстракция, лежащая в основе всех этих структур, которую мы называем монадой, не является необходимым для понимания или использования конкретных монадов. Это то, что может стать запоздалой мыслью после того, как вы увидели более одного примера и узнали образец: обучение переходит от конкретного к абстрактному. Непосредственное объяснение абстракции, обращаясь к аналогии самой абстракции, обычно не помогает учащемуся понять, что это абстракция.

+2

Это неудачная ситуация. Интересно, нашел ли [этот парень] (http://wadler.blogspot.com/2009/05/brief-incomplete-and-mostly-wrong.html) учебник монады, который он попросил? –

+0

+1. Майк Ванье [делает это заявление] (http://mvanier.livejournal.com/1205.html) тоже. –

+3

"Хромой"? Нет. Любое абстрактное понятие может быть изучено путем изучения различных частных случаев (примеров) и обобщения, но редко с помощью аналогов (которые обычно несовершенны и в лучшем случае могут сделать его менее запретительным, а не помогать в понимании).* После того, как вы понимаете, что такое монады, вы сможете придумать множество аналогов - и упражнение может вам даже помочь, но нет никаких доказательств того, что ни один из семилиний учебников по монадам по аналогии никогда не помогал им в первую очередь. :-) – ShreevatsaR

5

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

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

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

В программировании это то же самое. Способ, которым ведет себя tell, зависит от того, в какой монаде вы находитесь; способ сбора информации (>>=) зависит от того, в какую монаду вы находитесь. Такая же идея, в другом режиме разговора.

Черт, даже правила разговора могут быть монадическими. «Не говорите никому, что я сказал вам», скрывает информацию так же, как runST предотвращает ссылки на выход из монады ST. Очевидно, что разговоры могут иметь слои и слои контекста, точно так же, как у нас есть стеки монадных трансформаторов.

Надеюсь, что это поможет.

+0

Право - неявный контекст - это в основном то, что я назвал «возможным достижимым миром» в своем ответе. Одна вещь: comonads также подразумевает неявные контексты, и ваше объяснение, по-видимому, подходит им, а также монады (за исключением упоминания >> = и runST). Может быть, точнее, должно быть немного более конкретным о том, как происходят изменения в контексте. – RD1

12

В не-программирование терминов:

Если F и G представляют собой пару сопряженных функторов, с Р сопряжен слева к G, то композиция G.F является монадой.

+1

+1: для другого момента «ага» –

+2

Вы только что скопировали [предложение] (http://en.wikipedia.org/wiki/Monad_%28category_theory%29#Introduction) из Википедии? :-) На самом деле, монады функционального программирования [по-видимому, соответствуют * сильным монадам *] (http://en.wikipedia.org/wiki/Monads_in_functional_programming#Background) по математике. – ShreevatsaR

+0

Это не помогает; вы просто перешли от программирования к (возможно) математическим терминам ... – RCIX

1

Да, Монады происходят из концепции за пределами haskell. У Haskell есть много терминов и идей, которые были заимствованы из теории категорий. Это одна из них. Поэтому, если этот человек, который не является программистом, оказывается математиком, изучающим теорию категории, просто скажите: «Монада - моноид в категории эндофенторов».

+1

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

2

Это зависит от того, с кем вы разговариваете. Любое объяснение должно быть разбито на правильном уровне. Мое объяснение инженерам-химикам было бы отличным от моего объяснения математике или финансовому менеджеру.

Лучший подход - связать его с чем-то в экспертизе человека, с которым вы разговариваете. Как правило, секвенирование является довольно универсальной проблемой, поэтому постарайтесь найти что-то, что человек знает о том, где вы говорите: «Сначала сделайте X, затем сделайте Y». Затем объясните, как у обычных языков программирования есть проблема с этим; если вы скажете «сделайте X, затем сделайте Y» на компьютер, он сразу же X и Y не ждет ввода дополнительных данных, но тем не менее он не может выполнять Z за кого-то другого; компьютерная идея «а затем сделать» отличается от вашей. Поэтому программисты должны писать свои программы по-другому, чем объяснял вам (эксперт). Это создает разрыв между тем, что вы говорите, и тем, что говорит программа. Это стоит времени и денег, чтобы преодолеть этот пробел.

Monads позволяет вам поставить свою версию «а затем сделать» в компьютер, чтобы вы могли сказать «сделайте X, а затем выполните Y», и программист может написать «do {x; y}», и это означает что ты имеешь в виду.

6

От this excellent post Майк Ванье,

Одним из ключевых понятий в Haskell , что отличает его от других языков программирования является понятие о «монады». Люди, кажется, находят это трудно учиться (я тоже), и в результате есть грузы монадных учебников в Интернете, некоторые из которые очень хорошо (я особенно как All About Монады Джефф Newbern). Было даже сказано, что написания учебника монады - обряд прохождение для новых программистов Haskell. Однако одна большая проблема со многими монадных учебниками в том, что они пытаются объяснить, что монады в отношении к существующим представлениям о том, что читатель уже понимает (я даже видел это в презентациях Саймона Пейтон-Джонс, главный автор компилятора GHC и генерала Haskell grand poobah). Это ошибка, и я знаю, почему.

Это естественно, когда пытаются объяснить , что-то, чтобы объяснить это ссылкой на вещи, другой человек уже знает. Это хорошо работает , когда новая вещь похожа в некоторых способами вещей, которые другой человек знаком с. Он полностью ломается , когда новая вещь полностью отсутствует опыта человека его изучения. Например, если вы были , пытаясь объяснить, что такое огонь для педераста , который никогда не видел огня, что бы вы сказали? «Это вроде как перекресток воздуха и воды, но горячий ...» Не очень эффективно. Точно так же, объяснить, что атом в терминах квантовой механики является проблематичным, , потому что мы знаем, что электрон не действительно орбиты вокруг ядра, как планеты вокруг звезды, и понятие " делокализованный электронный облако "на самом деле не означает много. Фейнман однажды сказал, что никто действительно понял квантовую механику, и на интуитивном уровне, это правда. Но на математическом уровне квантовая механика хорошо понятна; мы просто не имеем хорошей интуиции для чего математика на самом деле означает.

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

Вот ответ: Монады является чисто абстрактным понятием, не фундаментальных отношений ни к чему вы, вероятно, никогда не слышали о раньше. Понятие монады приходит из теории категорий, которая является наиболее абстрактной отраслью математики I знаю. На самом деле, вся суть теории категорий является абстрактным из всех структуры математики разоблачить сходства и аналогии между, казалось бы, несопоставимых областей ( например, между алгеброй и топологии), так, чтобы уплотнить математики в ее фундаментальные концепции и, следовательно, уменьшают избыточность. (я мог бы продолжить об этом довольно , но я бы предпочел вернуться к пункту , который я пытаюсь сделать.) С тех пор как я , угадывая, что большинство программистов обучение Haskell мало знает около теория категорий, монады не собираются что-то означать для них. Это не означает, что они должны узнать все о теории категорий использовать монады в Haskell (к счастью), но это означает, что они должны освоиться думать о вещах более абстрактно, чем они вероятно, .

Пожалуйста, перейдите по ссылке вверху сообщения, чтобы прочитать полную статью.

+0

Ничего себе ... так что это практически бесполезно для большинства людей, как я всегда думал.Так же, как исчисление или любая отрасль физики, которую нельзя наблюдать в игре в бейсбол (http://www.amazon.com/Physics-Baseball-3rd-Robert-Adair/dp/0060084367). – StingyJack

+0

Это на самом деле обратное, оно полезно и так же хорошо известно как составная функция: http://stackoverflow.com/a/37345315/1614973 –

11

Есть ли понятие/вещь вне программирования (вне всех программирования, а не только FP), которые могли бы сказать, действовать или быть монада, как в существенным образом?

Да, на самом деле есть. Монады совершенно напрямую связаны с «возможностью» в модальной логике расширением изоморфизма Карри-Говарда. (См.: A Judgmental Reconstruction of Modal Logic.))

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

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

В этом виде монада p означает «в возможном достижимом мире из текущего мира».

В частности, если t тип, то:

x :: t означает что-то типа т непосредственно доступны в современном мире
y :: p t означает что-то типа Т доступен в мире достижимы от текущего

Тогда return позволяет использовать текущий мир как достижимый.

return :: t -> p t

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

(>>=) :: p t -> (t -> p s) -> p s

Так >>= можно использовать для построения пути к достижимости мира с меньшими путями через другие миры.

С мирами, являющимися чем-то вроде состояний, это довольно легко объяснить. Для чего-то вроде монады IO это тоже довольно легко: мир определяется всеми взаимодействиями, которые программа имела с внешним миром.

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

+3

Ничего себе, это * отличный * способ взглянуть на него - это делает причинную структуру более осязаемой, и я думаю, ее можно было бы также расширить, чтобы четко показать, почему «Монад» может встроить управление потоками, но «Аппликативный» не может. На самом деле, я думаю, это единственное хорошее описание монад, которые я когда-либо слышал, что не начинается с функторов или оперативного поведения программы. Мне обязательно нужно прочитать эту статью, спасибо! –

+0

Спасибо - этот взгляд распространен в кругах ML (особенно CMU), но в меньшей степени для Haskell. Возможно, добавление чего-то подобного выше на страницу «Монады» Wikipedia подходит? Кстати, в первую очередь речь идет о формулировании модальной логики - сделав это, «возможность» и «необходимость» соответствуют абстрактной паре монад-комонад. Чтобы получить сильные монады (например, Haskell), вы ограничиваетесь тем, что все предположения необходимы. Или вы можете моделировать эффекты, которые сильные монады не могут использовать для переноса потоков на удаленный хост. Большинство из них: http://www.cs.cmu.edu/~jwmoody/pub.html http: //www.cs.cmu .edu/~ tom7/papers/ – RD1

+0

Я все еще прихожу, чтобы понять, что такое монада и что делает, и должен сказать, что это описание близко соответствует тому, что я, кажется, интуитивно. Отличный ответ. – bojo