1. Par
A continuación se presenta un programa que pide un número al usuario e indica si el número introducido es par o impar
> module PF703 where
> import Random -- Para numeros aleatorios
> import Pf603 -- Para ver octrees
> getInt :: String -> IO Int
> getInt msg =
> do
> putStr msg
> readLn
> main = do
> n <- getInt "Número? "
> if n `mod` 2 == 0 then putStrLn "Es par"
> else putStrLn "Es impar"
Compilar dicho programa y ejecutarlo
2. Primo
Modificar el programa anterior para que pida un número e indique si el número introducido es primo o no
3. buscaPrimo
Modificar el programa anterior para que solicite números de forma repetida hasta que se introduzca un número primo.
4. juego
La generación de números aleatorios requiere efectos laterales.
Haskell proporciona la librería Random que incluye
varias funciones para generación de números aleatorios.
Las más habituales podrían ser:
randomIO :: IO a devuelve un valor aleatorio de tipo a (en realidad,
a debe pertenecer a la clase de tipos Random)randomRIO :: (a,a) -> IO a devuelve un valor aleatorio dentro de un intervalo
de valores.A modo de ejemplo, el siguiente programa solicita un número n
y escribe n números aleatorios entre 0 y 6
> aleas :: IO ()
> aleas = do
> n <- getInt "Numeros? "
> ponAleas n
> ponAleas :: Int -> IO ()
> ponAleas 0 = return ()
> ponAleas n = do
> a <- randomRIO (0,100)
> putStr (" " ++ show (a :: Int))
> ponAleas (n - 1)
5. cuentaCar
Escribir un programa Haskell que solicite el nombre de un fichero e indique cuántos caracteres contiene
6. catch
La función catch :: IO a -> (IOError -> IO a) -> IO a funciona
de la siguiente forma:
catch ac f intenta ejecutar la acción ac. Si no hay
errores devuelve lo que devuelva dicha acción. Si se producen errores, entonces
llama a la función f pasándole como argumento el error producido.
Por ejemplo, la siguiente función solicita el nombre de un fichero para contar el número de caracteres y, si se produce un error, lo comunica y vuelve a solicitar el fichero.
> cuentaSeguro =
> catch cuentaCar
> (\e -> do
> putStrLn ("Hubo un error: " ++ show e)
> cuentaSeguro)
Modificar el juego para que el programa no finalice si el usuario introduce valores no numéricos, sino que continúe pidiendo valores hasta que sean números
7. octrees Aleatorios (Opcional)
Generar octrees con figuras aleatorias. Pueden emplearse varios procedimientos. Un posible procedimiento tomar un octree y convertir cada elemento básico en una figura aleatoria.
8. Texto
Añadir el siguiente fragmento que permite generar un mensaje de texto
> wt txt = writeFile "text.wrl"
> (cabecera ++
> viewPoint (0,0,20) ++
> putText (0,0,0) (0,0.1,0.1) txt ++
> putBox (4,-2,-0.2) (0.8,1,1) (10,10,0.1)
> )
> putText p c = translate p . color c . verText
> putBox p c = translate p . color c . verBox
> putSphere p c = translate p . color c . verSphere
> verText t = "geometry Text { string \"" ++ t ++ "\"}"
> where l = length t
> verBox (sx,sy,sz) =
> "geometry Box { size " ++ sh3 (sx,sy,sz) ++ "}"
> verSphere r =
> "geometry Sphere { radius " ++ show r ++ "}"
9. leerTxt
Modificar el programa anterior para que el mensaje que muestra en el cartel sea leído de un fichero
10. enlaces
El siguiente fragmento permite añadir hiperenlaces entre mundos virtuales
> enlace url desc fig =
> "Anchor { description \"" ++ desc ++
> "\" url [\"" ++ url ++
> "\"] children [" ++ fig ++ "] }"
> cartel url msg =
> enlace url ("Enlace a " ++ url)
> (putText (0,0,0) (0,0.1,0.1) msg ++
> putBox (4,-2,-0.2) (0.8,1,1) (10,10,0.1))
> mundo1 = cabecera ++
> viewPoint (0,0,20) ++
> cartel "f2.wrl" "VER OTRO MUNDO" ++
> putSphere (-2,0,5) (1,0,0) 2
> mundo2 = cabecera ++
> viewPoint (0,0,20) ++
> cartel "p.html" "OTRA PAGINA"
> pagina = "<html><body><a href=\"f1.wrl\">Mundo</a></body></html>"
>
> enlaces =
> do
> writeFile "f1.wrl" mundo1
> writeFile "f2.wrl" mundo2
> writeFile "p.html" pagina
Crear varios mundos y páginas Web desde Haskell y enlazarlos.
Pueden crearse también mundos que contengan octrees.
La instrucción Inline de VRML permite insertar
un mundo dentro de otro mundo.
Para más información sobre otras instrucciones VRML pueden consultarse las especificaciones. Un tutorial en español puede ser: Creación de Mundos virtuales en VRML 97 de M. J. Abasolo