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
。
正在阅读有关 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
。