https://zh.m.wikibooks.org/wiki/Haskell/Category_theory说
join :: Monad m => m (m a) -> m a
join x = x >>= id
Run Code Online (Sandbox Code Playgroud)
是id 在类的身份函子Hask和也id有型a-> a?
>>=要求它的第二个参数具有type a->ma,如果id具有type a-> a,怎么可以id用作...的第二个参数>>=?
return具有类型a -> ma。是join和return彼此相反吗?
谢谢。
>>=要求它的第二个参数具有typea->ma,如果id具有typea-> a,怎么可以id用作...的第二个参数>>=?
不,>>=要求其第二个参数具有类型a -> m b,b不一定等于a。在您提到的情况下,我们选择a = m b了
(>>=) :: m (m b) -> (m b -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)
id然后可以作为type的第二个参数传递m b -> m b。
return具有类型a -> ma。是join和return彼此相反吗?
并非如此,因为我们没有join :: m a -> a。
当然,如果考虑到特殊情况a = m b,
return :: m b -> m (m b)
join :: m (m b) -> m b
Run Code Online (Sandbox Code Playgroud)
而且我们确实有join . return = id。
即使在这种特殊情况下,我们仍然没有return . join = id,例如在monad列表中:
return (join [[1],[2]]) = return [1,2] = [[1,2]]
Run Code Online (Sandbox Code Playgroud)