Entrada/salida en HASKELL

Post on 28-Jan-2016

79 views 0 download

description

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 - PowerPoint PPT Presentation

Transcript of Entrada/salida en HASKELL

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 -> Intsuma x y = x+y

Main> suma 3 25 :: 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 CharputChar :: Char -> IO ()

Operaciones básicas

getChar :: IO Char

Recibe: nada.

Acción: lee un carácter.

Devuelve: el carácter leído.

Operaciones básicas

getLine :: IO String

Recibe: nada.

Acción: lee una línea ( \n ).

Devuelve: un 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 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

Í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.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

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