Documente Academic
Documente Profesional
Documente Cultură
Es muy prctico usar Haskell de manera online, pero a veces nos resulta dificultoso si no
sabemos la sintaxis para ejecutar el cdigo de manera online, lo que va a acarrear que el
programa tire error y no podamos ejecutar nuestro cdigo. Este manual busca aclarar la forma
de poder ejecutar, sin que el programa tire error y el uso de Haskell online no se vuelva
frustrante, sino que por el contrario, se vuelva ameno y cmodo.
Empezamos dirigindonos a la pgina: http://rextester.com/l/haskell_online_compiler
Que significa que se imprima, despliegue o muestre en pantalla la cadena "Hello, world!"
fac 0 = 1
fac n = n * fac (n-1)
main = print (fac 42)
Con lo explicado anteriormente, es fcil deducir como se puede programar para introducir tres o
ms nmeros en el cdigo, para funciones que requieran tres o ms argumentos, por ejemplo,
para leer variables x, y y z en una funcin suma que tome tres nmeros se usara print (suma
4 3 8)
Ejemplo: Queremos leer una variable llamada x desde teclado: Entonces hacemos x <-
getLine
Lo otro que tenemos que entender que esta es una funcin IO (Input-Output) es decir entra un
elemento (puede ser esta un nmero, carcter, cadena) y sale otro elemento de otro tipo
fac 0 = 1
fac n = n * fac (n-1)
main :: IO ()
main = do
n <- getLine --Le pedimos al programa que obtenga la lnea
donde est el valor de la variable x
Como dije, el programa est incompleto y va a tirar error, porque nunca aplicamos la variable n
a la funcin fac
Si agregamos la instruccin print (fac n) debajo tambin va a tirar error , porque como
dice el mensaje de error: No hay instancia para (Num String) que surja de un uso de
'fac'
El operador ">>=" obtendr el valor del resultado de la primera accin mondica (aqu es la
accin IO de obtener entrada) y lo aplicar a la funcin de la derecha (aqu est la funcin
lambda que lee la entrada como Entero, aplica su funcin y lo devuelve a putStrLn, que lo
imprime en la pantalla). La sintaxis "do" es esencialmente solo un agregado sintctico para estas
operaciones mondicas, por lo que no afectar la ejecucin o el rendimiento del programa.
Se puede ir un paso ms all al escribirlo funcionalmente al escribirlo totalmente sin puntos.
Aqu si es conveniente (aunque no obligatorio) especificar el tipo de dato que recibe y que
devuelve
main = getLine >>= (putStrLn . show . fac . (read :: String -> Int))
El programa completo con la primera forma del main quedara de la siguiente manera
fac 0 = 1
fac n = n * fac (n-1)
main :: IO ()
main = do
n <- getLine --Le pedimos al programa que obtenga la lnea donde est el
valor de la variable x
putStrLn (show (fac (read n)))
Nota2: Recordar que Haskell, tanto online como de consola exige una correcta indentacin o
mordeo del cdigo, por lo tanto la lnea n <- getLine debe ir exactamente debajo de putStrLn
(show (fac (read n))), de lo contario va a tirar error de mordeo.
Se nos abre el cuadro input (entrada), es ah escribimos nuestra entrada, en este caso 5
Es una funcin que toma dos nmeros, y le aplica la frmula 2- (7 5nt) (2 7 dividido 5 a la
n por t
Pero esta funcin requiere dos argumentos, debemos aprender como leer dos argumentos desde
teclado
Ya sabemos que con n <- getLine leemos una variable llamada n y la funcin es un
InputOuput
Usando los conocimientos descriptos en las pginas anteriores con la funcin g, cambiamos la
funcin fac por g que es el nombre de la funcin nos estara quedando:
Tambin tirara error, porque la funcin pide dos argumentos y estamos dando uno solo.
Lo que tenemos que hacer es decir que lea la variable que llamamos t dentro del parntesis de g
que es la funcin g, escribiendo read t
Este cdigo sirve para leer dos valores y tiene la ventaja del anterior que se pueden leer
variables de cualquier tipo, incluido listas, aunque no tupas, eso se ver ms adelante
Introducir un dato tipo cadena String desde el cuadro input del programa
Tenemos la siguiente funcin jer que lo que hace es traducir una palabra al jeringoso
je:: String->String
je [] = []
je (a:xs)= if a=='a' || a=='e' || a=='i' || a=='o' || a=='u' then
a:'p':a:je(xs) else a:je (xs)
Recordar que xs indica lista, ya que un String es una lista de caracteres, por lo tanto la lectura
en este caso tendra que ser xs, en el getline, en lugar de un carcter solo como venamos
viendo, ya que un carcter solo se usa en el caso de ser una variable.
Por lo tanto el IO quedara de la siguiente manera:
main :: IO ()
main = do
xs <- getLine
putStrLn (show (je (read xs)))
Nota: La palabra que se va a traducir a jeringoso debemos ingresarla entre comillas. Ejemplo la
palabra "Faro" traducida al jeringoso sera "Faparopo"
Para hacer al programa ms amigable, podramos poner un cartel que nos informe acerca de la
respuesta simplemente colocando un putStrLn arriba de la sentencia getLine, por ejemplo
main = do
putStrLn "La palabra en jeringoso es"
xs <- getLine
putStrLn (show (je (read xs)))
main :: IO ()
main = do
xs <- getLine
ys <- getLine
putStrLn (show (iglist (read xs) (read ys)))
Lo mismo ocurre si ingresamos solo un nmero, tambin debemos hacerlo entre parntesis
recto, pues indica lista, de lo contrario va a tirar error.
Ejemplo:
Tenemos las siguientes funciones, una de ellas (sumDigits) suma la cantidad de cifras de un
numero
main :: IO ()
main = do
xs <- getLine
putStrLn (show (sumDigits (read xs)))
Para calcular la cantidad de cifras del nmero, por ejemplo 123 debemos ingresarlo [123] y no
123 o "123", pues en los dos ltimos casos tirara error.
Si somos observadores, notamos que en ejercicios anteriores cuando hacamos la lectura con
getLine y putStrLn con read no especificbamos el tipo de dato que leamos, cuando se
leen tuplas si es necesario especificar el tipo de dato que se lee, ya que Haskell no puede
inferirlo, pues no est especificado en la cabecera de la funcin.
Para especificar el tipo de dato escribimos :: y el tipo de dato. Ejemplo: Si queremos leer una
variable de tipo entero hacemos:
read a :: Int
Si quisiramos leer por ejemplo una tupla de Strings (lista de caracteres separados por comas, o
sea una cadena o String) hacemos:
read a :: [String]
Por otro lados la firma de la funcin read es read :: Read a => String -> a, Leer un
variable a implica (=>) leer un variable String y devolver otra variable
Su implantacin en Haskell es la siguiente
main :: IO ()
main = do
xs <- getLine
ys <- getLine
putStrLn (show (f (read xs :: [String]) (read ys ::
[[String]])))
Va a dar [("A","B"),("A","C"),("B","A"),("B","C"),("C","A"),("C","B"),
("C","D"),("D","C")] que es el resultado correcto.
Nota: En este ejercicio, el segundo parmetro puede ser omitido, pero para brindar ms
informacin decid dejarlo
Bibliografa
Espaol
https://wiki.haskell.org/Es/Haskell_en_5_pasos
http://aprendehaskell.es/content/Tipos.html
https://es.stackoverflow.com/questions/122428/leer-2-tuplas-desde-teclado-en-haskell-
online
https://es.stackoverflow.com/questions/79874/como-transformar-dos-listas-en-una-lista-
de-tuplas-en-haskell
https://es.stackoverflow.com/questions/122428/leer-2-tuplas-desde-teclado-en-haskell-
online
Ingls
https://stackoverflow.com/questions/10264044/output-integer-to-stdout-in-haskell