我正在寻找以下功能:
Applicative f => f (f a) -> f a
Hoogle告诉我join
:
>:t join
join :: Monad m => m (m a) -> m a
是否有符合我所需签名的功能?
答案 0 :(得分:50)
要在Carl's answer上展开一点,如果有join
之类的东西,但对于应用程序:
class Applicative f => ApplicativeWithJoin f where
join' :: f (f a) -> f a
然后你会自动拥有一个monad:
instance ApplicativeWithJoin m => Monad m where
return = pure
x >>= f = join' (f <$> x)
答案 1 :(得分:46)
没有这样的功能。 join
明确指出Applicative
缺少的内容和Monad
所拥有的内容。
答案 2 :(得分:7)
扩展SingleNegationElimination的答案:
Applicative
的{{1}}允许您将效果组合在一起并将它们的值组合在一起,或者使用<*>
来处理内部值,但是您无法生效依赖于先前计算的价值。<$>
允许效果由先前计算的结果确定,如Monad
所示。对于任何>>=
,您可以先使用Applicative
将<$>
内的a
类型的值转换为某些f a
,这样您就可以{ {1}}。但是如果没有f b
,内部f (f b)
只是另一个值,你无法将它与实际执行的外部值相结合。添加join
使其成为可能,允许定义f b
的全部功能。