正在阅读有关monad的教程并坚持以下内容:
let m = return 2 :: IO Int
Run Code Online (Sandbox Code Playgroud)
这是可以理解的 - 我们在monadic变量(IO 2)中打包2但是以下是什么意思?
m >>= return
Run Code Online (Sandbox Code Playgroud)
它输出2.
正如我从Monad定义中所知,返回总是只接受一个参数.但是,这里的争论不存在.如何理解?
(>>=)是绑定运算符.它有签名:
(>>=) :: Monad m => m a -> (a -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)
所以它期望(在左侧)一个monadic对象(例如IO Int),并在右侧一个函数a -> m b(例如Int -> IO b)在这里.
运算符用于将monad中的操作链接在一起.例如,putStrLn :: String -> IO ()如果我们使用它,可以使用它:
return "foo" >>= putStrLn
Run Code Online (Sandbox Code Playgroud)
所以现在我们return一个字符串"foo".绑定操作符将从IO monad中解包出来,并将其传递给putStrLn将打印"foo"到标准输出通道的函数,然后返回IO ().然后我们可以使用它IO ()进行进一步处理.
由于return将数据包装成monad,因此写入>>= return基本上是无用的.因为所有人都x x >>= return应该等于x.
在使用参数调用返回return的意义上,参数不会丢失>>=.你也可以写:
m >>= (\x -> return x)
Run Code Online (Sandbox Code Playgroud)
但这相当于m >>= return.