Подтвердить что ты не робот

"присоединиться" к применению?

Я ищу следующую функцию:

Applicative f => f (f a) -> f a

Hoogle показывает мне join:

>:t join
join :: Monad m => m (m a) -> m a

Есть ли функция, которая соответствует моей желаемой сигнатуре?

4b9b3361

Ответ 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.