En aquest tema, aprendrem els conceptes bàsics d'entrada i sortida (I/O) en Haskell. La gestió d'I/O és una part fonamental de qualsevol llenguatge de programació, i Haskell no és una excepció. Tot i que Haskell és un llenguatge funcional pur, proporciona mecanismes per treballar amb I/O de manera segura i eficient.
Conceptes Clau
- Monada IO: La monada
IO
encapsula operacions d'entrada i sortida, permetent que el codi Haskell es mantingui pur. - Funcions d'I/O: Funcions com
putStrLn
,getLine
,readFile
, iwriteFile
són utilitzades per realitzar operacions d'I/O. - Tipus IO: Les funcions que realitzen operacions d'I/O tenen el tipus
IO
.
Exemples Pràctics
putStrLn
i getLine
putStrLn
i getLine
La funció putStrLn
s'utilitza per imprimir una línia de text a la consola, mentre que getLine
llegeix una línia de text de la consola.
main :: IO () main = do putStrLn "Quin és el teu nom?" nom <- getLine putStrLn ("Hola, " ++ nom ++ "!")
Explicació:
putStrLn "Quin és el teu nom?"
: Imprimeix una línia de text a la consola.nom <- getLine
: Llegeix una línia de text de la consola i l'assigna a la variablenom
.putStrLn ("Hola, " ++ nom ++ "!")
: Imprimeix un missatge de benvinguda amb el nom introduït.
- Llegir i Escriure Fitxers
Les funcions readFile
i writeFile
permeten llegir i escriure fitxers.
main :: IO () main = do contingut <- readFile "entrada.txt" putStrLn "Contingut del fitxer:" putStrLn contingut writeFile "sortida.txt" contingut putStrLn "El contingut ha estat escrit a sortida.txt"
Explicació:
contingut <- readFile "entrada.txt"
: Llegeix el contingut del fitxerentrada.txt
i l'assigna a la variablecontingut
.putStrLn "Contingut del fitxer:"
: Imprimeix un missatge a la consola.putStrLn contingut
: Imprimeix el contingut del fitxer a la consola.writeFile "sortida.txt" contingut
: Escriu el contingut al fitxersortida.txt
.putStrLn "El contingut ha estat escrit a sortida.txt"
: Imprimeix un missatge de confirmació.
Exercicis Pràctics
Exercici 1: Salutació Personalitzada
Escriu un programa que demani el nom de l'usuari i la seva edat, i després imprimeixi un missatge personalitzat.
main :: IO () main = do putStrLn "Quin és el teu nom?" nom <- getLine putStrLn "Quina és la teva edat?" edat <- getLine putStrLn ("Hola, " ++ nom ++ "! Tens " ++ edat ++ " anys.")
Exercici 2: Copiar Fitxer
Escriu un programa que llegeixi el contingut d'un fitxer i el copiï a un altre fitxer.
main :: IO () main = do putStrLn "Introdueix el nom del fitxer d'entrada:" fitxerEntrada <- getLine putStrLn "Introdueix el nom del fitxer de sortida:" fitxerSortida <- getLine contingut <- readFile fitxerEntrada writeFile fitxerSortida contingut putStrLn ("El contingut ha estat copiat de " ++ fitxerEntrada ++ " a " ++ fitxerSortida)
Errors Comuns i Consells
- Oblidar el tipus
IO
: Recorda que les funcions que realitzen operacions d'I/O han de tenir el tipusIO
. - No utilitzar
do
: Les operacions d'I/O en Haskell sovint requereixen l'ús de la notaciódo
per encadenar accions. - Gestió d'errors: Considera la possibilitat d'errors en les operacions d'I/O, com ara fitxers inexistents o permisos denegats. Utilitza funcions com
catch
per gestionar excepcions.
Resum
En aquesta secció, hem après els conceptes bàsics d'I/O en Haskell, incloent-hi com utilitzar la monada IO
per encapsular operacions d'entrada i sortida. Hem vist exemples pràctics de com llegir i escriure a la consola i a fitxers, i hem practicat amb exercicis per reforçar aquests conceptes. Amb aquests fonaments, estàs preparat per explorar operacions d'I/O més avançades en Haskell.