m >> = return是什么意思?

Bul*_* M. 0 monads haskell

正在阅读有关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定义中所知,返回总是只接受一个参数.但是,这里的争论不存在.如何理解?

Wil*_*sem 6

(>>=)绑定运算符.它有签名:

(>>=) :: 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.