是联接和返回彼此的逆吗?

时间:2019-07-23 17:05:24

标签: haskell monads

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

>>=的类型为returna -> majoin彼此相反吗?

谢谢。

1 个答案:

答案 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 -> majoinreturn彼此相反吗?

并非如此,因为我们没有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]]