Теория монад и Haskell

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

Судя по этой теме:

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

Судя по этой теме:

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

Судя по этой теме: Кто-нибудь может объяснить Монады? это обычная проблема, и я попытался просмотреть большинство предлагаемых руководств (кроме видеороликов Брайана Бека, которые не воспроизводятся на моей Linux-машине):

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

Насколько я понимаю, монада состоит из тройки: эндофунктора и двух естественных преобразований.

Функтор обычно отображается с типом: (а -> б) -> (ма -> мб) Я включил вторую скобку, чтобы подчеркнуть симметрию.

Но это эндофунктор, поэтому разве домен и кодомен не должны быть такими же, как это?:

(a -> b) -> (a - > б)

Думаю, ответ состоит в том, что и домен, и кодомен имеют тип:

(a -> b) | (ma -> mb) | (mma -> mmb) и так далее ...

Но я не совсем уверен, работает ли это или согласуется с данным определением функтора?

Когда мы переходим к естественному преобразованию, оно становится равным хуже. Если я правильно понимаю, естественное преобразование - это функтор второго порядка (с определенными правилами), который является функтором от одного функтора к другому. Итак, поскольку мы определили функтор выше, общий тип естественных преобразований будет следующим: ((a -> b) -> (ma -> mb)) -> ((a -> b) -> (ma -> mb))

Но фактические естественные преобразования, которые мы используем, имеют тип:

a -> ma

ma -> (a -> mb) -> mb

Являются ли эти подмножества общей формы выше? и почему они являются естественными преобразованиями?

Мартин

35
задан Community 23 May 2017 в 12:25
поделиться