2014-09-25 69 views
0

我正在練習一個問題,它在stdin上給出了文本輸入,並希望在stdout上輸出。 他們在我讀的第一行給出一個整數T,然後跟隨T行。對於T後面的幾行,我有一個函數,它接受一個整數並返回一個我必須打印的整數。所以我的輸出應該是T線。 我卡在這一點上:Haskell列陣地圖陣列

main = do 
    strcases <- getLine 
    map (calculate) [1..(read strcases)] 

calculate _ = do 
    strp <- getLine 
    print $ addone (read strp) 

addone x = x+1 

當然,這並不此刻工作。你能展示如何打印輸出的T行嗎?

+1

你想'mapM_'。這是monadic map函數 – bheklilr 2014-09-25 14:24:58

+0

請參閱[這個答案](http://stackoverflow.com/questions/11403993/a-better-way-to-map-a-function-that-requires-io-over-a-list)詳細闡述。 – bheklilr 2014-09-25 14:26:03

+0

順便說一句,你可以簡單地寫'mapM_ calculate [1..read strcases]':不需要任何括號!而'print $ read strp + 1'也可以。不過,我會在兩種情況下針對'read'提供建議,最好使用'readLn'來直接獲取正確的類型。 ('read'和'readLn'都有些不安全,它們並不能真正處理解析錯誤,但是我認爲這對於您的應用程序來說並不是真正的問題。) – leftaroundabout 2014-09-25 14:30:12

回答

0

您可以使用readLn,它結合了getLineread,並從Control.MonadreplicateM_重複一個IO動作(或任何單子)一個給定的次數:

import Control.Monad 

main :: IO() 
main = do 
    n <- readLn 
    replicateM_ n calculate 

calculate :: IO() 
calculate = do 
    x <- readLn 
    print $ addone x 

addone :: Int -> Int 
addone x = x+1 

注意,在replicateM_下劃線後綴表示每個被執行的動作的返回值被丟棄。沒有下劃線後綴的替代函數將返回一個列表,其中包含每個執行操作的返回值,在這種情況下我們不希望這樣做。