Я просто прочитал следующее из typeclassopedia о разнице между Monad
и Applicative
. Я могу понять, что в Applicative
нет join
. Но следующее описание выглядит неопределенным для меня, и я не мог понять, что именно подразумевается под "результатом" монадического вычисления/действия. Итак, если я помещаю значение в Maybe
, что делает монаду, что является результатом этого "вычисления"?
Давайте посмотрим более внимательно на тип ( → =). Основная интуиция что он объединяет два вычисления в одно большее вычисление. первый аргумент, m a, является первым вычислением. Однако это было бы скучный, если второй аргумент был всего лишь m b; то не было бы способ для вычислений взаимодействовать друг с другом (на самом деле это это как раз ситуация с аппликативным). Итак, второй аргумент ( → =) имеет тип a → m b: функция этого типа, полученная в результате первое вычисление, может произвести второе вычисление для запуска.... Интуитивно, именно эта способность использовать вывод из предыдущего вычисления, чтобы решить, какие вычисления следует запускать дальше, что делает Monad более мощный, чем аппликативный. Структура аппликативного вычисление фиксировано, тогда как структура вычисления Монады может изменение на основе промежуточных результатов.
Есть ли конкретный пример, иллюстрирующий "способность использовать вывод из предыдущих вычислений, чтобы решить, какие вычисления будут выполняться дальше", который не имеет? Аппликатив не имеет?