m>> =返回是什么意思?

时间:2017-11-13 11:51:25

标签: haskell monads

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

let m = return 2 :: IO Int

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

m >>= return

输出2。

据我所知Monad定义, return 总是只接受一个参数。但是,这里的争论不存在。如何理解?

1 个答案:

答案 0 :(得分:6)

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

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

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

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

return "foo" >>= putStrLn

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

由于return将数据包装到monad中,因此编写>>= return基本上是无用的。因为所有x x >>= return都应该等于x

return将使用参数调用返回的意义上,>>=的参数不会丢失。你也可以写:

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

但这相当于m >>= return