Domanda

Fondamentalmente quello che devo fare è scrivere una funzione che includa un elenco di tipo [(String, String)] e stampa il contenuto in modo che, riga per riga, l'output assomiglia a questo:

FirstString : SecondString

FirstString : SecondString

..etc, per ogni elemento nell'elenco. Ho il seguente codice e lo stampa, ma per qualche motivo stampa una riga contenente [(), ()] alla fine.

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

C'è qualcosa che sto facendo di sbagliato?

È stato utile?

Soluzione

La stampa finale xs non è necessaria. la sequenza qui sta restituendo un sacco di () s (il valore restituito da putStrLn), e anche la stampa lo sta stampando.

Mentre ci sei, ora che print xs è sparito, puoi sbarazzarti del legame con la variabile xs e rendere la sequenza in sequenza_ per buttare via il valore restituito, dando:

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

Altri suggerimenti

Puoi persino usare mapM :

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

Sono d'accordo con ja che dovresti dividere il tuo codice in due funzioni:

  • Una parte pura : una funzione che accetta la struttura dei dati e li trasforma in una stringa
  • Una parte impura , che esegue il rendering di quella stringa sulla console

Ecco una semplice implementazione:

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

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

Questo design ha due vantaggi:

Per uno, la maggior parte della tua `logica 'è nella parte pura del codice, il che è carino, in un modo di programmazione funzionale.

In secondo luogo, e questo è solo un semplice principio di ingegneria del software; ora hai una funzione riutilizzabile che puoi utilizzare, nel caso in cui desideri formattare la struttura dei dati in un'altra parte del codice (sembra probabile).

Scrivi una funzione che porta una tupla in una stringa, formattata come desideri.
Quindi concatMap quella funzione sul tuo elenco; stampa il risultato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top