申请人'加入'?

Kev*_*ith 25 haskell

我正在寻找以下功能:

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)


Car*_*arl 46

没有这样的功能.join显然Applicative缺乏和Monad拥有.


Pet*_*lák 7

扩展SingleNegationElimination的答案:

  • Applicative<*>允许你一起影响他们的价值观结合起来,一起进去,或操作使用中的值<$>,但你不能做的效果取决于先前计算的值.
  • Monad另一方面,s允许效果由先前计算的结果确定,如见证所示>>=.

Applicative你可以先用任何一种方法<$>a内部类型的值转换f a成一些f b,这样你就可以得到f (f b).但是没有join,内在f b只是另一个值,你怎么能把它与实际执行的外部结合起来.添加join使其成为可能,允许定义的全部功能Monad.