m >>= return 是什么意思?

What does m >>= return means?

正在阅读有关 monad 的教程并坚持以下内容:

let m = return 2 :: IO Int

这是可以理解的——我们将 2 包装在 monadic 变量中 (IO 2) 但是以下是什么意思?

m >>= return

输出2。

正如我从 Monad 定义中得知的那样,return 总是只接受一个参数。但是,这里没有论据。怎么理解?

(>>=)bind 运算符。它有签名:

(>>=) :: Monad m => m a -> (a -> m b) -> m b

所以它期望(在左侧)一个单子对象(例如 IO Int),并在右侧期望一个函数 a -> m b(例如 Int -> IO b)。

运算符用于将 monad 中的操作链接在一起。例如 putStrLn :: String -> IO () 可以这样使用:

return "foo" >>= putStrLn

所以现在我们 return 一个字符串 "foo"。可以说,绑定运算符会将其从 IO monad 中解包出来,并将其传递给 putStrLn 函数,该函数会将 "foo" 打印到标准输出通道,并且 return 一个 IO ().然后我们可以使用 IO () 进行进一步处理。

由于return将数据包装成monad,写>>= return基本没用。因为对于所有 x x >>= return 应该等于 x.

return 的参数并没有丢失,因为 >>= 将使用参数调用 return。你也可以这样写:

m >>= (\x -> return x)

但这等同于m >>= return