我们可以从do-block中定义的replicateM访问输出

时间:2018-06-02 23:49:18

标签: haskell functional-programming monads do-notation

假设我有类似的东西

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?

2 个答案:

答案 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代替getLineread来简化代码。同样,putStrLn . show可以替换为print

main = do
    n <- readLn
    ints <- replicateM n readLn :: IO [Int]
    print ints