Хорошо, поэтому я не программист Haskell, но меня совершенно заинтриговало множество идей, стоящих за Haskell, и я изучаю его. Но я застрял в квадрате: я, похоже, не могу склонить голову над Монадами, которые кажутся довольно фундаментальными. Я знаю, что есть миллион вопросов о SO, которые просят объяснить Монады, поэтому я буду немного более конкретным в отношении того, что меня беспокоит:
Я прочитал эту замечательную статью (введение в Javascript) и подумал, что полностью понял Монад. Затем я прочитал запись в Википедии в Monads и увидел это:
Операция связывания полиморфного типа (M t) → (t → M u) → (M u), которую Haskell представляет оператором infix → =. Его первый аргумент - это значение в монадическом типе, его второй аргумент - это функция, которая отображает из основного типа первого аргумента в другой монадический тип, а его результат - в другом монадическом типе.
Хорошо, в статье, которую я привел, bind была функцией, которая принимала только один аргумент. Википедия говорит два. То, что я думал, что я понял о Монадах, было следующим:
- Цель Monad - использовать функцию с различными типами ввода и вывода и сделать ее составной. Он делает это, обертывая типы ввода и вывода одним монадическим типом.
- Монада состоит из двух взаимосвязанных функций: bind и unit. Bind принимает неконсолидируемую функцию f и возвращает новую функцию g, которая принимает монадический тип в качестве входных данных и возвращает монадический тип. g является композиционным. Функция unit принимает аргумент типа, ожидаемого f, и обертывает его в монадическом типе. Затем это можно передать в g или любой композиции таких функций, как g.
Но должно быть что-то не так, потому что моя концепция связывания принимает один аргумент: функцию. Но (согласно Википедии) Haskell bind фактически принимает два аргумента! Где моя ошибка?