2017-04-21 68 views
1

我想在列表理解中構建一個矩陣。對於每一行我需要getLine並解析出來。列表理解中的GetLine

總之,我想要做這樣的事情。

fun = [ getLine | y <- [0..4]] 

如果我運行這個功能,而不是從命令提示符下試圖函數getline的每一行,我得到一個錯誤用於從使用「打印」的產生沒有實例(顯示(IO字符串))。

我收到錯誤消息,但是如何在列表理解中獲得線?

+0

你剛纔在列表理解中使用了'getLine':P – immibis

+0

是的,我真的想使用列表理解,因此我可以獲得我將構建的矩陣的座標。 – mac10688

回答

7

如果你想採取行動的清單,評估每一個序列,並返回各自的結果 - [IO a] -> IO [a] - 有sequence

fun = sequence [getLine | y <- [0..4]] 

,這可以簡化爲Control.Monad.replicateM

fun = replicateM 5 getLine 
+0

該序列完成技巧,因爲我需要跟蹤索引以將矩陣單元轉換爲座標。謝謝!! – mac10688

+1

@ mac10688在這種情況下,您可能會發現許多其他有用的功能,例如'mapM'或'forM'。例如,'fun = forM [0..4] $ \ y - > do {print y; getLine}' – ephemient