申请人'加入'?

时间:2015-03-18 02:53:47

标签: haskell

我正在寻找以下功能:

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

Hoogle告诉我join

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

是否有符合我所需签名的功能?

3 个答案:

答案 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的全部功能。

相关问题