`bind`相当于join(fmap f m)?

时间:2014-08-29 23:33:03

标签: haskell monads

answer中的优秀question演示了bindjoin如何编写fmap

(>>=) :: m v -> (v -> m w) -> m w

  

说“如果你有制作v的策略,并且每个v a   产生w的后续策略,然后你有一个生产策略   一个w“。我们如何在加入方面捕获它?

mv >>= v2mw = join (fmap v2mw mv)

但是,我不明白具有v2mw类型的a -> m b如何检查fmap的第一个参数。

fmap :: Functor f => (a -> b) -> f a -> f b

1 个答案:

答案 0 :(得分:10)

让我们说v2mw :: c -> m d,这样做的事情并不含糊,

fmap :: Functor f => (a -> b) -> f a -> f b

然后fmap v2mw成功了f ~ ma ~ cb ~ m d,所以

fmap v2mw :: m c -> m (m d)

join :: m (m e) -> m e,因此join (fmap v2mw mv)按预期类型m d