Title: Entrada/salida en HASKELL
1Entrada/salida en HASKELL
Joaquín A. Bujalance Jiménez 2004
2Índice
- Introducción
- El problema de la entrada/salida
- El tipo IO
- Operaciones básicas
- El tipo IOError
- Ejemplos
- Bibliografía
3Introducción
- Haskell es
- Un lenguaje funcional puro
- No estricto
- Fuertemente tipificado
4El problema de la entrada/salida
- Se programa a través de funciones matemáticas
puras
suma Int -gt Int -gt Int suma x y xy Maingt
suma 3 2 5 Int
5El problema de la entrada/salida
- Sea g una función de entrada por teclado
- g Char
- Qué devuelve ?
- Qué problemas conlleva ?
6El tipo IO
- Es una mónada
- Estructura de dato que encapsula una acción
- getChar IO Char
- putChar Char -gt IO ()
7Operaciones básicas
- getChar IO Char
- Recibe nada.
- Acción lee un carácter.
- Devuelve el carácter leído.
8Operaciones básicas
- getLine IO String
- Recibe nada.
- Acción lee una línea ( \n ).
- Devuelve un string.
9Operaciones 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)
10Operaciones básicas
- interact ( String -gt String ) -gt IO ()
- Recibe una función de tipo String -gt 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.
11Operaciones básicas
- putChar Char -gt IO ()
- Primitiva.
- Recibe un carácter.
- Acción escribe el carácter recibido.
- Devuelve nada.
12Operaciones básicas
- putStr String -gt 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.
13Operaciones básicas
- putStrLn String -gt IO ()
- Se basa en putStr y hace lo mismo añadiendo un
carácter de nueva-línea.
14Operaciones 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.
15Operaciones básicas
- readFile FilePath -gt 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.
16Operaciones básicas
- writeFile FilePath -gt String -gt 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.
17Operaciones básicas
- appendFile FilePath -gt String -gt IO ()
- Primitiva.
-
- Lo mismo que writeFile pero añade el String al
final del fichero, manteniendo el contenido
anterior.
18Operaciones básicas
- gtgt Monad a gt a b -gt (b -gt a c) -gt a c
- gtgt Monad a gt a b -gt a c -gt a c
- do
- Las acciones se afectúan secuencialmente
- El ámbito de una variable introducida por lt- 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
19El tipo IOError
- Excepciones que se producen al realizar acciones
de entrada salida - Las excepciones pueden ser lanzadas y capturadas
20El tipo IOError
- catch IO a -gt ( IOError -gt IO a ) -gt 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
21ÍNDICE KWIC (KEYWORD IN CONTEXT) (1)
kwic FilePath -gt FilePath -gt FilePath -gt IO ()
kwic noClavesK títulosK salidaK do
lNoClaves lt- readFile noClavesK lTítulos lt-
readFile títulosK let lKwic kwic'
(creaNoClaves lNoClaves) lTítulos
writeFile salidaK lKwic
22ÍNDICE KWIC (2)
creaNoClaves String -gt Conjunto
PalabraNoClave creaNoClaves lines gt.gt
map words gt.gt concat gt.gt
map palAMay gt.gt foldr
añadeAConjunto conjuntoVacío
23ÍNDICE KWIC (3)
kwic' Conjunto PalabraNoClave -gt String -gt
String kwic' palNoClaves lines gt.gt map
words gt.gt creaTkw palNoClaves gt.gt concat gt.gt
dicConTkw gt.gt dicALista gt.gt map snd gt.gt
map ordListaALista gt.gt concat gt.gt map
showgt.gt unlines
24ÍNDICE KWIC (4)
creaTkw Conjunto PalabraNoClave -gt PalTítulo
-gtTkw creaTkw palNoClaves map (títuloKw
palNoClaves )
títuloKw Conjunto PalabraNoClave -gt Palabra
-gt Palabra -gt Tkw títuloKw palNoClaves pt
títuloKw palNoClaves pt (knt)
estáElemConjunto (palAMay k) palNoClaves sigTs
otherwise (Tkw pt k nt)sigTs where
sigTs títuloKw palNoClaves (pt k) nt
25ÍNDICE KWIC (5)
dicConTkw Tkw -gt Diccionario PalabraClave
(OrdLista Tkw) dicConTkw foldr (\(Tkw pt k
nt) dic -gt 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
26Bibliografí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/Buz
APD/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
27Bibliografía
- IO and monads. Input/output uin a functional
language. - (http//myweb.lsbu.ac.uk/abdallae/units/fp/iomon
ads.pdfsearch'io20and20monads20input/output2
0in20a20functional20language) - Elements of monadic IO.
- (http//www-fp.dcs.st-and.ac.uk/kh/papers/io-tut
orial/io-tutorial.html) - The Haskell 98 Library Report Input-Output
- (http//research.microsoft.com/Users/simonpj/hask
ell98-revised/haskell98-report-html/io.html) - Monads for the Working Haskell Programmer. A
short tutorial. - (http//www.engr.mun.ca/theo/Misc/haskell_and_mo
nads.htm) - Theodore Norvell Memorial University of
Newfoundland