"присоединиться" к применению?
Я ищу следующую функцию:
Applicative f => f (f a) -> f a
Hoogle показывает мне join
:
>:t join
join :: Monad m => m (m a) -> m a
Есть ли функция, которая соответствует моей желаемой сигнатуре?
Ответы
Ответ 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
.