Я изучаю монады и задаю несколько вопросов.
Вот где я сейчас. Пожалуйста, поправьте меня, где я ошибаюсь.
-
Символ
>>=
- это инфиксный оператор. Операторы Infix - это функции, которые принимают два аргумента (левая и правая) и возвращают значение. -
Символ
>>=
называется оператором связывания и имеет подписьMonad m => m t -> (t -> m u) -> m u
. Тем не менее, типы, похоже, не выстраиваются здесь. Мы получаем значение типаm t
, а второй аргумент - это функция, которая принимаетt
. (Я не вижу, как подключить точки.) -
Это должно означать, что функция связывания каким-то образом может удалить
m
изm t
, чтобы получитьt
и передать ее функции.
Вот мои вопросы:
-
Является ли возможность удалить
m
изm t
то, что возможно только внутри такого оператора привязки. Имеет ли этот оператор привязки какие-то особые привилегии или что-то еще? -
Что он должен делать с изменениями состояния? Я понимаю (я думаю), что цель монадов - "обернуть" побочные эффекты, чтобы они были изолированы от остальной части программы. Но какова роль оператора связывания в этом?