此answer中的优秀question演示了bind
和join
如何编写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
答案 0 :(得分:10)
让我们说v2mw :: c -> m d
,这样做的事情并不含糊,
fmap :: Functor f => (a -> b) -> f a -> f b
然后fmap v2mw
成功了f ~ m
,a ~ c
和b ~ m d
,所以
fmap v2mw :: m c -> m (m d)
和join :: m (m e) -> m e
,因此join (fmap v2mw mv)
按预期类型m d
。