Frage

Im Grunde, was ich tun muss, ist eine Funktion zu schreiben, die in einer Liste vom Typ [(String, String)] nimmt und druckt den Inhalt, so dass Zeile-für-Zeile, die Ausgabe wie folgt aussieht:

FirstString : SecondString

FirstString : SecondString

.. etc, für jedes Element in der Liste. Ich habe den folgenden Code bekam und er druckt es aus, aber aus irgendeinem Grunde druckt es am Ende eine Zeile mit [(),()] aus.

display :: Table -> IO ()
display zs = do { 
    xs <- sequence [putStrLn ( a ++ " = " ++ b) | (a, b) <- zs];
    print xs 
}

Gibt es etwas, was ich falsch mache?

War es hilfreich?

Lösung

Der letzte Druck xs ist nicht erforderlich. Sequenz wird hier eine Reihe von () s (der Rückgabewert von putStrLn) zurückkehrt, und Druck wird das auch ausgedruckt werden.

Während Sie gerade dabei sind, jetzt, dass Druck xs gegangen ist, können Sie loswerden der xs variable Bindung erhalten, und die Sequenz in sequence_ machen den Rückgabewert wegzuwerfen, geben:

display :: Table -> IO()
display zs = sequence_ [putStrLn (a++" = "++b) | (a,b) <- zs]

Andere Tipps

Sie könnten sogar mapM verwenden:

display :: Table -> IO ()
display = mapM_ (\(a,b) -> putStrLn (a++" = "++b))

Ich würde mit ja stimmen, dass Sie in Ihren Code aufteilen sollten zwei Funktionen:

  • A rein Teil: eine Funktion, die Ihre Datenstruktur nimmt und verwandelt es in eine Zeichenfolge
  • Ein unreinen Teil, die die Zeichenfolge an die Konsole
  • rendert

Hier ist eine einfache Implementierung:

showTable :: Table -> String
showTable xs = concatMap format xs
  where
    format (a, b) = a ++ " : " ++ b ++ "\n"

display :: Table -> IO ()
display table = putStr (showTable table)

Dieser Entwurf hat zwei Vorteile:

Zum einen der meisten Ihrer `Logik‘ sind in dem reinen Teil des Codes, das ist schön, in einer funktionalen Programmierung Art und Weise.

Zweitens, und das ist nur ein einfaches Software-Engineering-Prinzip; Sie jetzt eine wiederverwendbare Funktion, die Sie verwenden können, sollten Sie jemals Ihre Datenstruktur in einem anderen Teil des Codes zu forma (scheint wahrscheinlich).

Schreiben Sie eine Funktion, die ein Tupel in einen String nimmt, so formatiert, wie Sie es wünschen.
Dann concatMap diese Funktion über die Liste; drucken Sie das Ergebnis.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top