【发布时间】:2014-10-14 16:32:27
【问题描述】:
我正在学习一些介绍性的 Haskell 材料,目前正在学习 Monads。我从概念上理解 >>= 运算符的类型是:
(Monad m) => m a -> (a -> m b) -> m b。
在这种情况下,我很困惑为什么以下代码有效,即为什么它不会导致类型不匹配:
main = getLine >>= \xs -> putStrLn xs
既然我们知道getLine :: IO String,我假设它可以与String -> IO String 类型的函数“绑定”。但是putStrLn 属于不同类型:putStrLn :: String -> IO ()。
那么为什么 Haskell 允许我们将>>= 与这两个函数一起使用呢?
【问题讨论】:
-
a是String,m是IO,b是()(单位或空元组)。因此,lambda 的类型是String -> IO ()
标签: haskell bind monads io-monad