https://en.m.wikibooks.org/wiki/Haskell/Category_theory说
y = foo();
join :: Monad m => m (m a) -> m a
join x = x >>= id
是类别id
的身份函子,并且Hask
的类型为id
吗?
a-> a
要求其第二个参数的类型为>>=
,如果a->ma
的类型为id
,如何将a-> a
用作的第二个参数id
?
>>=
的类型为return
。
a -> ma
和join
彼此相反吗?
谢谢。
答案 0 :(得分:8)
>>=
要求其第二个参数的类型为a->ma
,如果id
的类型为a-> a
,如何将id
用作的第二个参数>>=
?
否,>>=
要求第二个参数的类型为a -> m b
,其中b
不一定等于a
。在您提到的情况下,我们选择a = m b
是为了
(>>=) :: m (m b) -> (m b -> m b) -> m b
然后可以将 id
作为类型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
我们有join . return = id
。
即使在这种特殊情况下,我们仍然没有return . join = id
,例如在清单monad中:
return (join [[1],[2]]) = return [1,2] = [[1,2]]