LINUX.ORG.RU

История изменений

Исправление a--, (текущая версия) :

У bind разные типы слева и справа. Я не понимаю, какую ассоциативность к этому ты хочешь прикрутить.

Я объясню почему я считаю это ассоциативностью. Другие могут обосновывать по-другому, но в википедии это тоже называется «essentially associative».

Начну издалека. Есть, допустим, функция sin с типом R->R. Из нее можно сделать другую функцию, назовем ее sin' с типом (T->R)->(T->R) и определив sin'(f)(x)=sin(f(x)). В обычных случаях можно и обратно получить sin из sin' (хотя, подозреваю, что так не в любой категории).

Ты, конечно, вправе считать sin' другой функцией, но обычный студент-математик даже не задумывался о разнице между sin и sin'. Думаю, что даже не все аспиранты задумывались.

Теперь перейдем к bind. Аналогично введем f.bind'(g)(x)=f(x).bind(g) который по-сути совпадает с bind

Тогда получим (m.bind(f)).bind(g) = m.bind(f.bind'(g))

P.S. Более полный ответ видимо должен содержать обобщения монад.

Исходная версия a--, :

У bind разные типы слева и справа. Я не понимаю, какую ассоциативность к этому ты хочешь прикрутить.

Я объясню почему я считаю это ассоциативностью. Другие могут обосновывать по-другому, но в википедии это тоже называется «essentially associative».

Начну издалека. Есть, допустим, функция sin с типом R->R. Из нее можно сделать другую функцию, назовем ее sin' с типом (T->R)->(T->R) и определив sin'(f)(x)=sin(f(x)). В обычных случаях можно и обратно получить sin из sin' (хотя, подозреваю, что так не в любой категории).

Ты, конечно, вправе считать sin' другой функцией, но обычный студент-математик даже не задумывался о разнице между sin и sin'. Думаю, что даже не все аспиранты задумывались.

Теперь перейдем к bind. Аналогично введем f.bind'(g)(x)=f(x).bind(g) который по-сути совпадает с bind

Тогда получим (m.bind(f)).bind(g) = m.bind(f.bind'(g))