• No se han encontrado resultados

Programas interactivos

N/A
N/A
Protected

Academic year: 2021

Share "Programas interactivos"

Copied!
21
0
0

Texto completo

(1)

Programas interactivos

Entrada y salida por consola

Dpto. Ciencias de la Computaci´on e Inteligencia Artificial Universidad de Sevilla

(2)

1 Programas interactivos

2 El tipo de las acciones de entrada/salida

3 Acciones b´asicas

4 Secuenciaci´on

5 Primitivas derivadas

6 Creaci´on de programas

(3)

Programas interactivos

Los programas por lote no interact´uan con los usuarios

durante su ejecuci´on.

• Los programas interactivos durante su ejecuci´on pueden leer datos del teclado y escribir resultados en la pantalla.

Problema:

• Los programas interactivos tienen efectos laterales. • Los programa Haskell no tiene efectos laterales.

(4)

Ejemplo de programa interactivo

Especificaci´on: El programa pide una cadena y dice el n´umero

de caracteres que tiene.

• Ejemplo de sesi´on: ghci> longitudCadena

Escribe una cadena: "Hoy es lunes" La cadena tiene 14 caracteres

Programa:

longitudCadena :: IO () longitudCadena = do

putStr "Escribe una cadena: " xs <- getLine

putStr "La cadena tiene " putStr (show (length xs)) putStrLn " caracteres"

(5)

1 Programas interactivos

2 El tipo de las acciones de entrada/salida

3 Acciones b´asicas

4 Secuenciaci´on

5 Primitivas derivadas

6 Creaci´on de programas

(6)

El tipo de las acciones de entrada/salida

En Haskell se pueden escribir programas interactivos usando

tipos que distingan las expresiones puras de las acciones

impuras que tienen efectos laterales.

IO a es el tipo de las acciones (de E/S) que devuelven un

valor del tipo a.

Ejemplos:

• IO Char es el tipo de las acciones que devuelven un car´acter. • IO () es el tipo de las acciones que no devuelven ning´un valor.

(7)

1 Programas interactivos

2 El tipo de las acciones de entrada/salida

3 Acciones b´asicas

4 Secuenciaci´on

5 Primitivas derivadas

6 Creaci´on de programas

(8)

Acciones b´

asicas

getChar :: IO Char

La acci´on getChar lee un car´acter del teclado, lo muestra en la pantalla y lo devuelve como valor.

putChar :: c -> IO ()

La acci´on putChar c escribe el car´acter c en la pantalla y no devuelve ning´un valor.

return :: a -> IO a

La acci´on return c devuelve el valor c sin ninguna interacci´on.

Ejemplo:

ghci> putChar ’b’ bghci> it

()

Nota: el comando it devuelve el resultado devuelto por la instrucci´on anteriormente introducida en el int´erprete.

(9)

1 Programas interactivos

2 El tipo de las acciones de entrada/salida

3 Acciones b´asicas

4 Secuenciaci´on

5 Primitivas derivadas

6 Creaci´on de programas

(10)

Secuenciaci´

on

Una sucesi´on de acciones puede combinarse en una acci´on

compuesta mediante expresiones do.

• Ejemplo: el procedimiento ejSecuenciacion lee dos

caracteres y devuelve el par formado por ellos. Veamos en una sesi´on: ghci> ejSecuenciacion b f (’b’,’f’) • Definici´on de la misma: ejSecuenciacion :: IO (Char,Char) ejSecuenciacion = do x <- getChar getChar y <- getChar return (x,y)

(11)

1 Programas interactivos

2 El tipo de las acciones de entrada/salida

3 Acciones b´asicas

4 Secuenciaci´on

5 Primitivas derivadas

6 Creaci´on de programas

(12)

Primitivas derivadas

Lectura

Lectura de cadenas del teclado:

getLine :: IO String getLine = do x <- getChar if x == ’\n’ then return [] else do xs <- getLine return (x:xs)

(13)

Primitivas derivadas

Escritura

Escritura de cadenas en la pantalla:

putStr :: String -> IO () putStr [] = return () putStr (x:xs) = do

putChar x putStr xs

Escritura de cadenas en la pantalla y salto de l´ınea:

putStrLn :: String -> IO () putStrLn xs = do

putStr xs putChar ’\n’

(14)

Secuencia de acciones

Ejecuci´on de una lista de acciones (equivalente a poner cada

elemento como una l´ınea dentro de un do).

Veamos una ejecuci´on:

ghci> sequence_ [putStrLn "uno", putStrLn "dos"] uno dos ghci> it () • Definici´on: sequence_ :: [IO a] -> IO () sequence_ [] = return () sequence_ (a:as) = do a sequence_ as

(15)

Secuencia de acciones

Ejemplos - I

Ejemplo: programa pide una cadena y dice el n´umero de

caracteres que tiene.

Veamos una ejecuci´on:

ghci> longitudCadena

Escribe una cadena: "Hoy es lunes" La cadena tiene 14 caracteres

odigo del programa:

longitudCadena :: IO () longitudCadena = do

putStr "Escribe una cadena: " xs <- getLine

putStr "La cadena tiene " putStr (show (length xs)) putStrLn " caracteres"

(16)

Secuencia de acciones

Ejemplos - II

Ejemplo: funci´on que recibe una lista de cadenas y va

imprimiendo una en cada l´ınea.

Veamos una ejecuci´on:

ghci> pruebaF ["hola","vamos a probar","no me f´ıo mucho"] hola

vamos a probar no me f´ıo mucho ghci>

odigo de la funci´on:

pruebaF :: [String] -> IO ()

(17)

1 Programas interactivos

2 El tipo de las acciones de entrada/salida

3 Acciones b´asicas

4 Secuenciaci´on

5 Primitivas derivadas

6 Creaci´on de programas

(18)

Compilaci´

on de programas

Como en muchos lenguajes, la ejecuci´on comienza por la

funci´on que se llama main: main :: IO ()

main = putStrLn "hola mundo"

Desde la terminal/cmd, puedes evaluar tu programa (si tu

fichero se llama hola.hs): $ runhaskell hola.hs

Desde la terminal/cmd, puedes compilar tu programa (si tu

fichero se llama hola.hs): $ ghc hola.hs -o hola $ ./hola

(19)

Compilaci´

on de programas

• Si has compilado el programa, ten en cuenta que en la salida se hace un

buffering que se libera cuando se encuentra un salto de l´ınea. • putStr puede tener comportamiento distinto al esperado. Fuente.

main = do putStr "Who are you? " name <- getLine

putStrLn ("Hello, " ++ name)

• Se puede arreglar de dos formas con el m´odulo System.IO: • Forzando la salida del buffer despu´es de putStr

import System.IO

main = do putStr "Who are you? " hFlush stdout

name <- getLine

putStrLn ("Hello, " ++ name)

• Desactivando el buffering en la salida

main = do

hSetBuffering stdout NoBuffering putStr "Who are you? "

name <- getLine

(20)

1 Programas interactivos

2 El tipo de las acciones de entrada/salida

3 Acciones b´asicas

4 Secuenciaci´on

5 Primitivas derivadas

6 Creaci´on de programas

(21)

Bibliograf´ıa

H. Daum´e III.Yet Another Haskell Tutorial, 2006. Chapter 5: Basic Input/Output

G. Hutton Programming in Haskell. Cambridge University Press, 2007. Chapter 9: Interactive programs

B. O’Sullivan, D. Stewart y J. Goerzen. Real World Haskell. O’Reilly, 2008. Chapter 7:I/O

B.C. Ruiz, F. Guti´errez, P. Guerrero y J.E. Gallardo. Razonando con Haskell. Thompson, 2004..

Cap´ıtulo 7: Entrada y salida

S. Thompson. Haskell: The Craft of Functional Programming, Second Edition. Addison-Wesley, 1999.

Chapter 9: Generalization: patterns of computation Chapter 18: Programming with actions

Referencias

Documento similar

potestatis, quedando, poco a poco, un ámbito puramente secular -—referida a lo temporal- - cada vez más desligado, empero, de aquél. Mediante la doc- trina de la soberanía

pues aixó es lo pichOi', Qni hacha vist á Pepa Lluesma y á tats així el 'apaüatsL .. Podrá dir qne disfras,ats mas ha vist en

Para ello, trabajaremos con una colección de cartas redactadas desde allí, impresa en Évora en 1598 y otros documentos jesuitas: el Sumario de las cosas de Japón (1583),

El cambio de representaciones sociales donde el individuo se provee de imágenes en las que se descubre con unas cualidades, como estados intrínsecos de su ser, con unas

El Centro de juventud y familia del colegio Santa Mariana de Jesús orienta, guía y acompaña a la comunidad Marianita dinamizando espacios para la formación en liderazgo,

Antes de comer y después de la emotiva conferencia “El equilibrista, otra forma de caminar” de Josan Rodríguez, le tocó el turno a la sexualidad y al deporte con

Las computadoras y la interacción con el internet siempre ha sido uno de mis hobbies: buscar sobre formatos, medios audiovisuales y la ingeniería propia de

(Camps, A.,1994), los diferentes tipos de textos (clasificados según el tipo, el género, la intención y el registro lingüístico), la imprescindible adopción de una estrategia