![Page 1: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/1.jpg)
Entrada/salida en HASKELL
Joaquín A. Bujalance Jiménez
2004
![Page 2: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/2.jpg)
Índice
Introducción El problema de la entrada/salida El tipo IO Operaciones básicas El tipo IOError Ejemplos Bibliografía
![Page 3: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/3.jpg)
Introducción
Haskell es: Un lenguaje funcional
puro No estricto Fuertemente tipificado
![Page 4: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/4.jpg)
El problema de la entrada/salida Se programa a través de funciones
matemáticas puras
suma :: Int -> Int -> Intsuma x y = x+y
Main> suma 3 25 :: Int
![Page 5: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/5.jpg)
El problema de la entrada/salida
Sea g una función de entrada por teclado
g :: Char
¿ Qué devuelve ? ¿ Qué problemas
conlleva ?
![Page 6: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/6.jpg)
El tipo IO
Es una mónada Estructura de dato que encapsula
una acción
getChar :: IO CharputChar :: Char -> IO ()
![Page 7: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/7.jpg)
Operaciones básicas
getChar :: IO Char
Recibe: nada.
Acción: lee un carácter.
Devuelve: el carácter leído.
![Page 8: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/8.jpg)
Operaciones básicas
getLine :: IO String
Recibe: nada.
Acción: lee una línea ( \n ).
Devuelve: un string.
![Page 9: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/9.jpg)
Operaciones básicas
getContents :: IO String
Recibe: nada.
Acción: lee una línea ( \n ).
Devuelve: un string.
( Hace lo mismo que getLine pero utilizando evaluación perezosa)
![Page 10: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/10.jpg)
Operaciones básicas
interact :: ( String -> String ) -> IO ()
Recibe: una función de tipo String -> String.
Acción: lee un String del puerto de entrada, lo pasa a la función y el String resultado lo escribe en el puerto de salida.
Devuelve: nada.
![Page 11: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/11.jpg)
Operaciones básicas
putChar :: Char -> IO ()
Primitiva.
Recibe: un carácter.Acción: escribe el carácter recibido.Devuelve: nada.
![Page 12: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/12.jpg)
Operaciones básicas
putStr :: String -> IO ()
Se basa en la primitiva putChar.
Recibe: un String.
Acción: escribe el String recibido. Utiliza putChar para escribir los caracteres de uno en uno.
Devuelve: nada.
![Page 13: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/13.jpg)
Operaciones básicas
putStrLn :: String -> IO ()
Se basa en putStr y hace lo mismo añadiendo un carácter de “nueva-línea”.
![Page 14: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/14.jpg)
Operaciones básicas
type FilePath = String
Una forma de nombrar los ficheros. Es un String que contiene la ruta del fichero.
Internamente utiliza algún método específico de implementación para convertir cadenas en identificadores de fichero válidos para el sistema.
![Page 15: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/15.jpg)
Operaciones básicas
readFile :: FilePath -> IO String
Primitiva.
Recibe: un nombre de fichero. Acción: lee el fichero indicado.Devuelve: un String con el contenido del fichero.El fichero se lee según se necesita, de forma
“perezosa”. En este sentido funciona igual que la función getContents.
![Page 16: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/16.jpg)
Operaciones básicas
writeFile :: FilePath -> String -> IO ()
Primitiva.
Recibe: un nombre de fichero y un String.Acción: escribe el String recibido como segundo
argumento en el fichero indicado. Presupone que existe y borra su contenido antes de escribir.
Devuelve: nada.
![Page 17: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/17.jpg)
Operaciones básicas
appendFile :: FilePath -> String -> IO ()
Primitiva.
Lo mismo que writeFile pero añade el String al final del fichero, manteniendo el contenido anterior.
![Page 18: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/18.jpg)
Operaciones básicas >>= :: Monad a => a b -> (b -> a c) -> a c >> :: Monad a => a b -> a c -> a c do
Las acciones se afectúan secuencialmente El ámbito de una variable introducida por <- son las
acciones posteriores hasta el final de la expresión do El tipo de la expresión do es el tipo de la última acción La regla del sangrado de Haskell se aplica tras la
palabra do, por lo que todas las acciones de su ámbito deben estar en la misma columna
![Page 19: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/19.jpg)
El tipo IOError Excepciones que se producen al
realizar acciones de entrada salida Las excepciones pueden ser
lanzadas y capturadas
![Page 20: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/20.jpg)
El tipo IOErrorcatch :: IO a -> ( IOError -> IO a ) -> IO a
Los manejadores no son selectivos (capturan todas las excepciones) por lo que el programador se debe encargar de propagar las que no desea manejar
Ej: getChar' :: IO Char getChar' = getChar `catch` eofHandler where eofHandler e = if isEOFError e then return '\n' else ioError e
![Page 21: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/21.jpg)
ÍNDICE KWIC (KEYWORD IN CONTEXT) (1)
kwic :: FilePath -> FilePath -> FilePath -> IO ()
kwic noClavesK títulosK salidaK =
do lNoClaves <- readFile noClavesK
lTítulos <- readFile títulosK
let lKwic = kwic' (creaNoClaves lNoClaves) lTítulos
writeFile salidaK lKwic
![Page 22: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/22.jpg)
ÍNDICE KWIC (2)
creaNoClaves :: String -> Conjunto PalabraNoClave
creaNoClaves = lines >.>
map words >.>
concat >.>
map palAMay >.>
foldr añadeAConjunto conjuntoVacío
![Page 23: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/23.jpg)
ÍNDICE KWIC (3)
kwic' :: Conjunto PalabraNoClave -> String -> String
kwic' palNoClaves =
lines >.> map words >.>
creaTkw palNoClaves >.>
concat >.>
dicConTkw >.>
dicALista >.>
map snd >.>
map ordListaALista >.>
concat >.> map show>.> unlines
![Page 24: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/24.jpg)
ÍNDICE KWIC (4)
creaTkw :: Conjunto PalabraNoClave -> [PalTítulo] ->[[Tkw]]
creaTkw palNoClaves = map (títuloKw palNoClaves [])
títuloKw :: Conjunto PalabraNoClave -> [Palabra] -> [Palabra] -> [Tkw]
títuloKw palNoClaves pt [] = []
títuloKw palNoClaves pt (k:nt)
| estáElemConjunto (palAMay k) palNoClaves = sigTs
| otherwise = (Tkw pt k nt):sigTs
where sigTs = títuloKw palNoClaves (pt++ [k]) nt
![Page 25: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/25.jpg)
ÍNDICE KWIC (5)
dicConTkw :: [Tkw] -> Diccionario PalabraClave (OrdLista Tkw)
dicConTkw = foldr (\(Tkw pt k nt) dic ->
añadeTkw (palAMay k) (Tkw pt k nt) dic) dicVacío
where añadeTkw k tkw dic = actualizaDic k nuevaAsocK dic
where
asocK = valorODefEnDic k dic ordListaVacía
nuevaAsocK = añadeAOrdLista tkw asocK
![Page 26: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/26.jpg)
Bibliografía Razonando con Haskell. Un curso sobre programación
funcional.Blas C. Ruiz, Fco. Gutiérrez, Pablo Guerrero, José E. Gallardo (2004)
A Gentle introduction to Haskell.P. Hudak, J. Fasel (1999)
Entrada / Salida en Haskell(http://www.info-ab.uclm.es/asignaturas/42630/BuzAPD/Trabajos/IOHaskell.doc)
Introducción al lenguaje Haskell. (http://lsi.uniovi.es/~labra/FTP/IntHaskell98.pdf)Jose E. Labra G. (1998)
IO in Haskell. Using stream- and monad-IO in Haskell.Oskar Ojala Helsinki University of Technology
![Page 27: Entrada/salida en HASKELL Joaquín A. Bujalance Jiménez 2004](https://reader035.vdocumento.com/reader035/viewer/2022081603/5665b43d1a28abb57c904bb4/html5/thumbnails/27.jpg)
Bibliografía IO and monads. Input/output uin a functional language.
(http://myweb.lsbu.ac.uk/~abdallae/units/fp/iomonads.pdf#search='io%20and%20monads%20input/output%20in%20a%20functional%20language‘)
Elements of monadic IO.(http://www-fp.dcs.st-and.ac.uk/~kh/papers/io-tutorial/io-tutorial.html)
The Haskell 98 Library Report Input-Output(http://research.microsoft.com/Users/simonpj/haskell98-revised/haskell98-report-html/io.html)
Monads for the Working Haskell Programmer. A short tutorial.(http://www.engr.mun.ca/~theo/Misc/haskell_and_monads.htm)Theodore Norvell Memorial University of Newfoundland