Pregunta

Básicamente, lo que debo hacer es escribir una función que tome en una lista de tipo [(String, String)] e imprima el contenido de manera que, línea por línea, la salida se ve así:

FirstString : SecondString

FirstString : SecondString

..etc, para cada elemento de la lista. Tengo el siguiente código y lo imprime, pero por alguna razón imprime una línea que contiene [(), ()] al final.

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

¿Hay algo que esté haciendo mal?

¿Fue útil?

Solución

La impresión final xs no es necesaria. La secuencia aquí está devolviendo un montón de () s (el valor de retorno de putStrLn), y la impresión también está imprimiendo eso.

Mientras estás en ello, ahora que la impresión xs se ha ido, puedes deshacerte del enlace de la variable xs y convertir la secuencia en secuencia_ para eliminar el valor de retorno, dando:

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

Otros consejos

Incluso puedes usar mapM :

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

Estoy de acuerdo con ja en que debe dividir su código en dos funciones:

  • Una parte pura : una función que toma su estructura de datos y la convierte en una cadena
  • Una parte impura , que representa esa cadena en la consola

Aquí hay una implementación simple:

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

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

Este diseño tiene dos ventajas:

Por un lado, la mayor parte de su `lógica 'está en la parte pura del código, lo cual es bueno, en una forma de programación funcional.

En segundo lugar, y esto es solo un simple principio de ingeniería de software; ahora tiene una función reutilizable que puede usar, si alguna vez desea formatear su estructura de datos en otra parte de su código (parece probable).

Escriba una función que lleve una tupla a una cadena, con el formato que desee.
Entonces concatMap esa función sobre tu lista; imprimir el resultado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top