Есть ли функция, которая соответствует моей желаемой сигнатуре?
Ответ 1
Развернуть бит на Carl answer, если была такая вещь, как join, но для аппликаций:
class Applicative f => ApplicativeWithJoin f where
join' :: f (f a) -> f a
Затем вы автоматически получите монаду:
instance ApplicativeWithJoin m => Monad m where
return = pure
x >>= f = join' (f <$> x)
Ответ 2
Нет такой функции. join явно отсутствует Applicative и Monad имеет.
Ответ 3
Чтобы развернуть ответ SingleNegationElimination:
Applicative<*> позволяет объединить эффекты вместе и их значения внутри или управлять значением внутри с помощью <$>, но вы не можете заставить эффект зависеть от значения предыдущего вычисления.
Monad s, с другой стороны, разрешить эффект, определяемый результатом предыдущего вычисления, о чем свидетельствует >>=.
При любом Applicative вы можете сначала использовать <$> для преобразования значения типа a внутри f a в некоторый f b, поэтому вы получите f (f b). Но без join внутренний f b - это просто другое значение, нет способа как его объединить с внешним, который фактически выполняется. Добавление join позволяет, чтобы определить полную мощность Monad.