为什么(= <<)id =加入Haskell?

lou*_*zer 3 haskell

(=<<) :: (a -> m b) -> m a -> m b
id :: a -> a
join :: m (m a) -> m a
Run Code Online (Sandbox Code Playgroud)

所以不应该,

(=<<) id
Run Code Online (Sandbox Code Playgroud)

给出错误是因为,

id :: a -> a
Run Code Online (Sandbox Code Playgroud)

并不是,

id :: a -> m a
Run Code Online (Sandbox Code Playgroud)

不(= <<)期望,

(something -> m anything)
Run Code Online (Sandbox Code Playgroud)

作为它的第一个论点?

ken*_*ytm 5

m a' -> m a'也是一种a -> a,所以我们可以拥有

      id ::  m a' -> m a'                        -- a = m a'
   (=<<) :: (m a' -> m a') -> m (m a') -> m a'   -- a = m a', b = a'

(=<<) id ::                   m (m a') -> m a'
Run Code Online (Sandbox Code Playgroud)

  • 哦!知道了!(=&lt;&lt;) :: (ma' -&gt; m a') -&gt; m (m a') -&gt; ma' -- a = m a', b = a' 为我做的。a 可以是 m a',所需要的只是取回包裹在 m 中的任何东西。谢了哥们! (2认同)