我正在寻找以下功能:
Applicative f => f (f a) -> f a
Hoogle告诉我join:
>:t join
join :: Monad m => m (m a) -> m a
Run Code Online (Sandbox Code Playgroud)
有没有符合我想要的签名的功能?
Sin*_*ion 50
为了扩展卡尔的答案,如果有这样的事情join,但对于申请人:
class Applicative f => ApplicativeWithJoin f where
join' :: f (f a) -> f a
Run Code Online (Sandbox Code Playgroud)
然后你会自动拥有一个monad:
instance ApplicativeWithJoin m => Monad m where
return = pure
x >>= f = join' (f <$> x)
Run Code Online (Sandbox Code Playgroud)
扩展SingleNegationElimination的答案:
Applicative的<*>允许你一起影响他们的价值观结合起来,一起进去,或操作使用中的值<$>,但你不能做的效果取决于先前计算的值.Monad另一方面,s允许效果由先前计算的结果确定,如见证所示>>=.Applicative你可以先用任何一种方法<$>将a内部类型的值转换f a成一些f b,这样你就可以得到f (f b).但是没有join,内在f b只是另一个值,你怎么能把它与实际执行的外部结合起来.添加join使其成为可能,允许定义的全部功能Monad.