正在阅读有关monad的教程并坚持下面的内容:
let m = return 2 :: IO Int
这是可以理解的 - 我们在monadic变量(IO 2)中打包2 但是以下是什么意思?
m >>= return
输出2。
据我所知Monad
定义, return 总是只接受一个参数。但是,这里的争论不存在。如何理解?
答案 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
。