2017-04-21 44 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