Вот мой текущий удар в нем:
Монады ковшеобразные бригадами:
- Каждая операция является человек, стоящий в очереди; то есть есть однозначная последовательность, в которой происходят операции.
- Каждый человек берет одно ведро в качестве входных данных, извлекает из него материал и помещает в ковш новый материал. Ведро, в свою очередь, передается следующему человеку в бригаде (через привязку, или
>>=
, операция).
- Операция
return
- это просто операция по размещению материала в ковше.
- В случае последовательности (
>>
) операции с содержимым ведра сбрасываются до того, как они будут переданы следующему человеку. Следующему человеку все равно, что было в ведре, они просто ждут его получения.
- В случае с монадами на
()
билет проходит внутри ведра. Это называется «Единица», и это просто чистый лист бумаги.
- В случае с монадами IO каждый человек говорит что-то вслух, это либо глубоко глубокое, либо совершенно глупое - но они могут говорить только, когда держат ведро.
Надеюсь, это поможет. :-)
Edit: Я ценю вашу поддержку, но, к сожалению, проклятие Монада Учебник ударил снова. То, что я описал, является просто функциональным приложением с контейнерами, а не с монадами! Но я не нигилист - я считаю, что проклятие Monad Tutorial может быть нарушено! Итак, вот несколько больше, um, сложное изображение, которое я думаю, это немного лучше. Вы решаете, стоит ли брать его друзьям.
Monads являются ведро бригады с руководителями проектов. Руководители проектов стоят за всеми, кроме первого члена бригады. Члены ведровой бригады сидят на табуретах и перед ними стоят ведра.
Первый человек получает кое-что, что-то делает с ним и кладет его в ведро. Этот человек тогда уходит - не к следующему человеку в бригаде, это было бы слишком легко! :-) - но менеджеру проекта стоит за этим человеком.
Руководитель проекта (ее имя bind, или >>=
) принимает ведро и решает, что с ним делать.Она может решиться вытащить вещи из первого лица из ведра и просто передать ее лицу перед ней без дальнейших церемоний (это монада IO). Она может выбросить ведро и закончить бригаду (это fail
). Она может решить просто обойти человека перед собой и передать ведро следующему менеджеру в бригаде без дальнейших церемоний (вот что происходит с Nothing
в монаде Maybe
). Она даже может принять решение вытащить материал из ведра и передать его человеку перед собой за один раз! (Это Монада Список.) В случае последовательности (>>
) она просто ударяет плечо лица перед ней, вместо того, чтобы передавать им все.
Когда следующий человек создает ведро вещей, человек передает его следующему менеджеру проекта. Следующий руководитель проекта снова выяснит, что делать с ведром, которое она дала, и передает вещи в ведро своей персоне. В конце, ведро передается назад вверх по цепочке менеджеров проектов, которые могут по желанию делать вещи с ведром (например, монада собирает все результаты). В результате первый менеджер проекта создает ведро вещей.
В случае синтаксиса do
каждый человек фактически является операцией, которая определена на месте в контексте всего, что было раньше - как если бы менеджер проекта проходил не только то, что находится в ведре, но и значения (er, stuff), которые были созданы предыдущими членами бригады. Построение контекста в этом случае намного проще, если вы выберете вычисление с использованием связывания и последовательности вместо использования синтаксиса do
- обратите внимание, что каждый следующий «оператор» представляет собой анонимную функцию, созданную в рамках операции, которая предшествует этой точке.
() значения, IO-монады и операция return
остаются описанными выше.
«Но это слишком сложно! Почему люди не могут просто выгружать ведра сами?» Я слышу, как вы спрашиваете. Ну, менеджер проекта может выполнить кучу работы за кулисами, которая в противном случае усложнила бы работу человека. Мы пытаемся упростить работу этих членов бригады, поэтому им не нужно делать слишком много. Например, в случае Модификации Maybe каждый человек не должен проверять ценность того, что им дано, чтобы увидеть, были ли они даны Ничто - менеджер проекта позаботится об этом для них.
«Ну, если вы снова пытаетесь облегчить работу каждого человека, почему бы не пройти весь путь - попросите человека просто взять вещи и передать материал, и пусть менеджер проекта беспокоится о bucketing? " Это часто делается, и у него есть специальное имя, называемое , поднимающее человека (er, операция) в монаду. Иногда, однако, вы хотите, чтобы у человека было что-то более сложное, где ему нужен какой-то контроль над созданным ведром (например, нужно ли возвращать Nothing
в случае монады Maybe
), и это то, что монада в полной общности.
Точки являются:
- Операции секвенировали.
- Каждый человек знает, как сделать ведра, но не как получить материал из ведер.
- Каждый менеджер проекта знает, как бороться с ведрами, и как получить материал из них, но все равно, что в них.
Таким образом, заканчивается учебное пособие по постели.:-P
Я думаю, что слышал, что монады - это что-то, что связано с перегрузкой операторов буррито в категории endospachesuit. Я не знаю, это звучит довольно сложно. –
Ehrm, не является ли «монада» уже не-программирующим термином? – sepp2k
Является ли «функтор» не-программирующим термином? Я помню, что у меня был момент «ага», когда я понял, что они просто специальные функторы. –