1 / 27

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

jerusha
Download Presentation

Entrada/salida en HASKELL

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Entrada/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

  3. Introducción Haskell es: • Un lenguaje funcional puro • No estricto • Fuertemente tipificado

  4. Se programa a través de funciones matemáticas puras El problema de la entrada/salida suma :: Int -> Int -> Int suma x y = x+y Main> suma 3 2 5 :: Int

  5. El problema de la entrada/salida • Sea g una función de entrada por teclado g :: Char • ¿ Qué devuelve ? • ¿ Qué problemas conlleva ?

  6. El tipo IO • Es una mónada • Estructura de dato que encapsula una acción getChar :: IO Char putChar :: Char -> IO ()

  7. Operaciones básicas getChar :: IO Char Recibe: nada. Acción: lee un carácter. Devuelve: el carácter leído.

  8. Operaciones básicas getLine :: IO String Recibe: nada. Acción: lee unalínea ( \n ). Devuelve: un string.

  9. Operaciones básicas getContents :: IO String Recibe: nada. Acción: lee unalínea ( \n ). Devuelve: un string. ( Hace lo mismo que getLine pero utilizando evaluación perezosa)

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

  11. Operaciones básicas putChar :: Char -> IO () Primitiva. Recibe: un carácter. Acción: escribe el carácter recibido. Devuelve: nada.

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

  13. Operaciones básicas putStrLn:: String -> IO () Se basa en putStr y hace lo mismo añadiendo un carácter de “nueva-línea”.

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

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

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

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

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

  19. El tipo IOError • Excepciones que se producen al realizar acciones de entrada salida • Las excepciones pueden ser lanzadas y capturadas

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

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

  22. ÍNDICE KWIC (2) creaNoClaves :: String -> Conjunto PalabraNoClave creaNoClaves = lines >.> map words >.> concat >.> map palAMay >.> foldr añadeAConjunto conjuntoVacío

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

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

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

  26. 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 OjalaHelsinki University of Technology

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

More Related