2017-04-21 5 views
1

Ich möchte eine Matrix in einem Listenverständnis erstellen. Für jede Zeile muss ich getLine und parse es aus.GetLine innerhalb Listenverständnis

Kurz gesagt, möchte ich so etwas tun.

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

Wenn ich diese Funktion zu starten, anstatt zu versuchen, getLine von Eingabeaufforderung für jede Zeile, erhalte ich einen Fehler für keine Instanz für (Show (IO String)) von einer Verwendung von ‚Druck‘ entstehen.

Ich bekomme die Fehlermeldung, aber wie bekomme ich getLine innerhalb eines Listenverständnisses?

+0

Sie haben gerade 'getLine' innerhalb eines Listenverständnisses verwendet: P – immibis

+0

Ja, ich möchte wirklich Listenverständnis verwenden, damit ich Koordinaten für eine Matrix bekommen kann, die ich erstellen werde. – mac10688

Antwort

7

Wenn Sie eine Liste von Maßnahmen ergreifen mögen, bewertet jedes in Folge, und kehrt jedes Ergebnis - [IO a] -> IO [a] - es gibt sequence:

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

und dies kann zu Control.Monad.replicateM vereinfacht werden:

fun = replicateM 5 getLine 
+0

Die Sequenz macht den Trick, weil ich den Index verfolgen muss, um die Matrixzellen in Koordinaten zu verwandeln. Vielen Dank!! – mac10688

+1

@ mac10688 In diesem Fall finden Sie möglicherweise eine Reihe anderer nützlicher Funktionen wie 'mapM' oder' forM'. Zum Beispiel 'fun = forM [0..4] $ \ y -> do {print y; getLine} ' – ephemient