每个monad都是一个endofunctor。
bind
是monad的组成,由fmap
和join
组成。
fmap
是endofunctor的功能。
那么,可以肯定地说join
也是endofunctor的功能吗?
答案 0 :(得分:2)
endofunctor是一对映射:一个将一个类型映射到另一个类型,另一个将一个函数映射到另一个函数。从这个意义上讲,endofunctor“具有” fmap
,因为fmap
是功能到功能的映射。
monad是一个三元组,由一个endofunctor和两个自然变换组成。自然转换之一是return :: a -> m a
。在Haskell中,另一个是(>>=) :: m a -> (a -> m b) -> m b
。 join ms = ms >>= id
,但是我们可以很容易地说join :: m (m a) -> m a
是与monad和m >>= f = join (fmap f m)
相关的自然变换。在这种情况下, monad (不是endofunctor)“具有” join
作为功能。