假设我有类似的东西
main = do
input_line <- getLine
let n = read input_line :: Int
replicateM n $ do
input_line <- getLine
let x = read input_line :: Int
return ()
***putStrLn $ show -- Can i access my replicateM here?
return ()
我可以访问我的replicateM的结果,例如它是否为返回值,例如将其打印出来。或者我是否必须在实际的do-block中使用replicateM?
答案 0 :(得分:4)
专攻IO
replicateM :: Int -> IO a -> IO [a]
表示它返回一个列表。所以在你的例子中你可以这样做:
results <- replicateM n $ do
input_line <- getLine
let x = read input_line :: Int
return x -- <- we have to return it if we want to access it
print results
答案 1 :(得分:3)
replicateM n a
返回a
返回的值列表。在你的情况下,因为你最后有return ()
,所以只是一个单位列表,但是如果用return x
替换它,你将得到一个读整数的列表。然后,您可以使用<-
将其从IO
中删除。
您还可以使用readLine
代替getLine
和read
来简化代码。同样,putStrLn . show
可以替换为print
。
main = do
n <- readLn
ints <- replicateM n readLn :: IO [Int]
print ints