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

Haskell `bind`相当于join(fmap f m)?,haskell,monads,Haskell,Monads,这一点非常好,说明了如何用join和fmap编写bind: (>>=)::mv->(v->mw)->mw 说“如果你有一个产生一个v的策略,并且对于每个v a 接下来的策略是产生一个w,那么你就有了一个产生w的策略 a“w”。我们如何在连接方面捕捉到这一点 mv>>=v2mw=join(fmap v2mw-mv) 但是,我不明白v2mw是如何检查fmap的第一个参数的a->mb类型的 fmap::Functor f=>(a->b)->fa->fb假设v2mw::c->md,这样事情就不会模棱两可

这一点非常好,说明了如何用
join
fmap
编写
bind

(>>=)::mv->(v->mw)->mw

说“如果你有一个产生一个v的策略,并且对于每个v a 接下来的策略是产生一个w,那么你就有了一个产生w的策略 a“w”。我们如何在连接方面捕捉到这一点

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

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


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

假设
v2mw::c->md
,这样事情就不会模棱两可了,而且

fmap :: Functor f => (a -> b) -> f a -> f b
然后
fmap v2mw
的计算结果是
f~m
a~c
b~md
,所以

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

join::m(me)->me
,因此
join(fmap v2mw-mv)
具有预期的
md
类型。

b
成为
mb
fmap v2mw::fa->f(mb)
。然后,
join
强制
f
等于
m
并折叠层。所以
fmap
中的
b
可以是任何类型,包括
mb
?是的!确切地两个
b
出现在不同的上下文中,不需要相同。
两个b出现在不同的上下文中
您正在谈论
fmap
的签名中的
b
fmap::Functor f=>(a->b)->f a->f b
?当然
b
必须是同一类型的,不是吗?对不起,不是,我的意思是
fmap
中的
b
签名与
v2mw
中的
mb
中的
(>=)
的签名“等于”,或“与相同”