【问题标题】:'join' for Applicatives?“加入”申请?
【发布时间】:2015-03-18 02:53:46
【问题描述】:

我正在寻找以下功能:

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

Hoogle 显示join

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

是否有与我想要的签名相匹配的函数?

【问题讨论】:

标签: haskell


【解决方案1】:

稍微扩展一下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)

【讨论】:

    【解决方案2】:

    没有这样的功能。 join 显然是 Applicative 所缺少的和 Monad 所具有的。

    【讨论】:

      【解决方案3】:

      扩展 SingleNegationElimination 的答案:

      • Applicative&lt;*&gt; 允许您将效果组合在一起并将它们的值组合在一起,或者使用 &lt;$&gt; 操作内部的值,但您不能使效果依赖于先前计算的值。
      • 另一方面,Monads 允许由先前计算的结果来确定效果,正如 &gt;&gt;= 所见证的那样。

      对于任何Applicative,您可以首先使用&lt;$&gt;f a 内的a 类型的值转换为f b,这样您将得到f (f b)。但是没有join,内部f b 只是另一个值,你无法将它与实际执行的外部值结合起来。添加join 使其成为可能,允许定义Monad 的全部功能。

      【讨论】:

        猜你喜欢
        • 2017-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        相关资源
        最近更新 更多