从 IO 域中获取一个值,进入“Haskell 世界”
您使用绑定运算符:(>>=) :: Monad m => m a -> (a -> m b) -> m b
。
如果m = IO
它看起来像:(>>=) :: IO a -> (a -> IO b) -> IO b
。
如您所见,具有类型的函数a -> IO b
解决了a
没有IO
.
因此,在 IO monad 中给出一个值,例如getLine :: IO String
:
getInt :: IO Int
getInt = getLine >>= (\s -> return (read s))
在这里,s :: String
,read :: String -> Int
和return :: Int -> IO Int
。
您可以使用 do-block 重写它:
getInt :: IO Int
getInt = do
s <- getLine
return (read s)
或者使用执行此操作的标准库函数:
getInt :: IO Int
getInt = readLn
至于您的示例,您可以使用 let-binding 立即修复它:
foo :: IO ()
foo = do
input <- sequence [getLine, getLine, getLine]
let ints = bar input
mapM_ print ints
bar :: [String] -> [Int]
bar = map read
或者您可以重组它以getInt
按照上面的定义使用:
foo :: IO ()
foo = sequence [getInt, getInt, getInt] >>= mapM_ print