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
中的(>=)
的签名“等于”,或“与相同”