История изменений
Исправление 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))