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

Tim*_*Tim -2 monads haskell

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。是joinreturn彼此相反吗?

谢谢。

chi*_*chi 8

>>=要求它的第二个参数具有type a->ma,如果id具有type a-> a,怎么可以id用作...的第二个参数>>=

不,>>=要求其第二个参数具有类型a -> m bb不一定等于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。是joinreturn彼此相反吗?

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

  • @Tim例如,在列表monad中,可以将“ join”应用于列表列表,但不能应用于非列表列表。join [True]是类型错误。 (3认同)
  • 实际上,这是有关monad的一个非常基本的观点。它们使您可以在monad内嵌入任意值(使用`return`),并在嵌套monad中将外层展平(即“ join”),但是通常,*没有*方法可以“删除”单子。(`>> =`,只是fmap和join的组合,可以让您假装访问其中的值,但前提是您必须将它们提供给返回单值的函数。)对于“ IO”非常重要,如果存在函数“ IO a-> a”,Haskell的纯度将被破坏。 (2认同)