2017-04-21 5 views
1

リストの理解度でマトリックスを作成したいと考えています。各行に対して、私はgetLineと解析する必要があります。リスト内のGetLine

要するに、私はこのようなことをしたい。

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

私はこの機能を実行する場合は、代わりに、各行のコマンドプロンプトからのgetlineしようとする、私は「印刷」の使用に起因する(ショー(IO String)を)なしインスタンスのエラーを取得します。

エラーメッセージが表示されますが、リスト内でどのように取得するのですか?

+0

リスト内包の中で 'getLine'を使っただけです:P – immibis

+0

ええ、私は実際にリストの理解を使いたいので、私が作る行列の座標を得ることができます。 – mac10688

答えて

7

あなたは、アクションのリストを取る順番に各1を評価し、それぞれの結果を返すしたい場合 - [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