我正在学习一些介绍性的 Haskell 材料,目前正在学习 Monads。我从概念上理解>>=
运算符的类型:
(Monad m) => m a -> (a -> m b) -> m b
.
在这种情况下,我很困惑为什么以下代码有效,即为什么它不会导致类型不匹配:
main = getLine >>= \xs -> putStrLn xs
既然我们知道这一点getLine :: IO String
,我会假设它可以与 type 的函数“绑定” String -> IO String
。然而putStrLn
是不同的类型:putStrLn :: String -> IO ()
.
那么为什么 Haskell 允许我们使用>>=
这两个函数呢?