Entrada/salida en HASKELL
Joaquín A. Bujalance Jiménez
2004
Índice







Introducción
El problema de la entrada/salida
El tipo IO
Operaciones básicas
El tipo IOError
Ejemplos
Bibliografía
Introducción
Haskell es:



Un lenguaje funcional puro
No estricto
Fuertemente tipificado
El problema de la entrada/salida

Se programa a través de funciones
matemáticas puras
suma :: Int -> Int -> Int
suma x y = x+y
Main> suma 3 2
5 :: Int
El problema de la entrada/salida

Sea g una función de entrada por
teclado
g :: Char


¿ Qué devuelve ?
¿ Qué problemas conlleva ?
El tipo IO


Es una mónada
Estructura de dato que encapsula una
acción
getChar :: IO Char
putChar :: Char -> IO ()
Operaciones básicas
getChar
::
IO
Recibe: nada.
Acción: lee un carácter.
Devuelve: el carácter leído.
Char
Operaciones básicas
getLine
::
IO
Recibe: nada.
Acción: lee una línea ( \n ).
Devuelve: un string.
String
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)
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.
Operaciones básicas
putChar
::
Char -> IO ()
Primitiva.
Recibe: un carácter.
Acción: escribe el carácter recibido.
Devuelve: nada.
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.
Operaciones básicas
putStrLn ::
String -> IO ()
Se basa en putStr y hace lo mismo
añadiendo un carácter de “nueva-línea”.
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.
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.
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.
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.
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
El tipo IOError


Excepciones que se producen al realizar
acciones de entrada salida
Las excepciones pueden ser lanzadas y
capturadas
El tipo IOError
catch :: 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
Í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
ÍNDICE KWIC (2)
creaNoClaves :: String -> Conjunto PalabraNoClave
creaNoClaves = lines >.>
map words >.>
concat >.>
map palAMay >.>
foldr añadeAConjunto conjuntoVacío
Í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
Í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
Í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
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.infoab.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
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%20function
al%20language‘)
Elements of monadic IO.
(http://www-fp.dcs.st-and.ac.uk/~kh/papers/io-tutorial/iotutorial.html)
The Haskell 98 Library Report Input-Output
(http://research.microsoft.com/Users/simonpj/haskell98revised/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
Descargar

Entrada/salida en HASKELL