Можем ли мы получить доступ к выводу replicateM, определенному в блоке do - PullRequest
0 голосов
/ 03 июня 2018

Предположим, у меня есть что-то вроде этого

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, например, если это было возвращенное значение, и, например, распечатать его.Или мне нужно работать с replicateM внутри фактического do-блока?

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Специализируется на 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
0 голосов
/ 03 июня 2018

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
...