Допустим, у нас есть две монадические функции:
f :: a -> m b
g :: b -> m c
h :: a -> m c
Функция связывания определяется как
(>>=) :: m a -> (a -> m b) -> m b
Мой вопрос в том, почему мы не можем сделать что-то вроде ниже. Объявить функцию, которая будет принимать монадическое значение и возвращать другое монадическое значение?
f :: a -> m b
g :: m b -> m c
h :: a -> m c
Функция связывания определяется как
(>>=) :: m a -> (ma -> m b) -> m b
Что в хаскеле запрещает функции принимать монадическое значение в качестве аргумента?
РЕДАКТИРОВАТЬ :Я думаю, что не прояснил свой вопрос. Дело в том, что когда вы составляете функции с помощью оператора связывания, почему второй аргумент для оператора связывания является функцией, которая принимает не -монадическое значение(b
)? Почему он не может принимать монадическое значение(mb
)и вернуть mc
. Дело в том, что когда вы имеете дело с монадами, функция, которую вы будете составлять, всегда будет иметь следующий тип.
f :: a -> m b
g :: b -> m c
h :: a -> m c
иh = f 'compose' g
Я пытаюсь изучить монады, и я не могу этого понять.