【发布时间】: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
我正在寻找以下功能:
Applicative f => f (f a) -> f a
Hoogle 显示join:
>:t join
join :: Monad m => m (m a) -> m a
是否有与我想要的签名相匹配的函数?
【问题讨论】:
标签: haskell
稍微扩展一下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)
【讨论】:
没有这样的功能。 join 显然是 Applicative 所缺少的和 Monad 所具有的。
【讨论】:
扩展 SingleNegationElimination 的答案:
Applicative 的 <*> 允许您将效果组合在一起并将它们的值组合在一起,或者使用 <$> 操作内部的值,但您不能使效果依赖于先前计算的值。Monads 允许由先前计算的结果来确定效果,正如 >>= 所见证的那样。对于任何Applicative,您可以首先使用<$> 将f a 内的a 类型的值转换为f b,这样您将得到f (f b)。但是没有join,内部f b 只是另一个值,你无法将它与实际执行的外部值结合起来。添加join 使其成为可能,允许定义Monad 的全部功能。
【讨论】: