Uso de Haskell online Es muy práctico usar Haskell de manera online, pero a veces nos resulta dificultoso si no sabemos la sintaxis para ejecutar el código de manera online, lo que va a acarrear que el programa tire error y no podamos ejecutar nuestro código. 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 cómodo. Empezamos dirigindonos a la página! "ttp!##rextester.com#l#"askell$online$compiler
%ll& por defecto nos encontramos con el siguiente código!
--ghc 7.10 main = print $ "Hello, world!" 'ue significa que se imprima, despliegue o muestre en pantalla la cadena ( Hello, world!" )ulsamos el botón
que se encuentra en la parte inferior de la página.
*eremos que no tiró errores de compilación y que "izo lo que deseábamos
Leer e introducir números desde el código %"ora vamos a trabajar con n+meros que especificaremos desde el código 'ueremos compilar un código que muestre el factorial de un n+mero. enemos el siguiente código
fac 0 = 1 fac n = n * fac (n-1) main = print (fac ) ) )egamos este código en la ventana de la aplicación y le damos en el botón de ejecutar -os va a dar 1000#11777%% 1000#11777%%&1#0#11#%% &1#0#11#%%&000000000 &000000000 resultado del factorial de /.
que es el
Leer e introducir dos o más números desde teclado )odemos "acer tambin que lea dos n+meros desde teclado, en una función que requiera leer dos n+meros. )or ejemplo tenemos la función suma, que lo que "ace es recibir dos enteros y devolver la suma de ellos.
'ma nt -+ nt -+ nt 'ma = main = print ('ma & &) ) 0i ejecutamos el código nos va a dar 7 que es el resultado correcto. 1on lo explicado anteriormente, es fácil deducir como se puede programar para introducir tres o más n+meros en el código, para funciones que requieran tres o más argumentos, por ejemplo, para leer variables , y / en una función función suma que tome tome tres n+meros se usar&a print ('ma 4 3 8)
Introducir un número desde cuadro de texto input del programa 2o más práctico y para no tener que modificar el código es poder lograr que el programa lea el n+mero desde la casilla de texto input, y no prefijarlo en el código. 2o primero que temeos que entender es que "ay una palabra clave para leer un n+mero desde teclado. 3ic"a palabra clave es getine Ejempl Ejemplo! o! 'uerem 'ueremos os leer leer una variable variable llamad llamadaa desde desde teclad teclado! o! Entonc Entonces es "acemo "acemoss getine 2o otro que tenemos que entender que esta es una función 2 45nput67utput8 es decir entra un elemento 4puede ser esta un n+mero, carácter, cadena8 y sale otro elemento de ot ro tipo Esto se debe especificar arriba de la instrucción main = do como main 2 () 2o que significa que el main devuelve un 2 El programa 4incompleto8 estar&a quedando de la siguiente forma
fac 0 = 1 fac n = n * fac (n-1) main 2 () main = do n - getine --Le pedimos al programa que obtenga la línea donde está el valor de la variable x
1omo dije, el programa está incompleto y va a tirar error, porque nunca aplicamos la variable n a la función fac 0i agregamos la instrucción print (fac n) debajo tambin va a tirar error , porque como dice el mensaje de error! 3o ha in'tancia para (3m 4tring) 5e 'r6a de n 'o de fac )ara corregir el programa debemos agregar la siguiente sintaxis!
pt4trn ('how (fac (read n))) 3onde! pt4trn indica poner en una l&nea 'how! 9ostrar, en este caso por pantalla
fac! El nombre de la función read 2eer una variable en este caso va a ser l a variable llamada n Nota!
-o es necesario especificar el tipo de dato, aunque si s e lo incluye no va a tirar error.
)ara escribirlo en forma más funcional, es posible utilizar transformaciones mónada, para pasar de esa manera
main = getine ++= (8n -+ pt4trn('how (fact (read n)))) El operador ( ++=( obtendrá el valor del resultado de la primera acción monádica 4aqu& es la acción 57 de obtener entrada8 y lo aplicará a la función de la derec"a 4aqu& está la función lambda que lee la entrada como Entero, aplica su función y lo devuelve a pt4trn, que lo imprime en la pantalla8. 2a sintaxis (do( es esencialmente solo un agregado sintáctico para estas operaciones monádicas, por lo que no afectará la ejecución o el rendimiento del programa. 0e puede ir un paso más allá al escribirlo funcionalmente al escribirlo totalmente sin puntos. %qu& si es conveniente 4aunque no obligatorio8 especificar el tipo de dato que recibe y que devuelve
main = getine ++= (pt4trn . 'how . fac . (read 4tring -+ nt)) 0in especificar el tipo de dato que se lee
main = getine ++= (pt4trn . 'how . 'ma9ifra' . (read)) El programa completo con la primera forma del main quedar&a de la siguiente manera
fac 0 = 1 fac n = n * fac (n-1 (n-1) main 2 () main = do n - getine --Le pedimos al programa que obtenga la línea donde está el valor de la variable x
pt4trn ('how (fac (read n))) Nota2!
:ecordar que Haskell, tanto online como de consola exige una correcta indentación o mordeo del código, por lo tanto la l&nea n - getine debe ir exactamente debajo de pt4trn ('how (fac (read n))), de lo contario va a tirar error de mordeo. %brimos el cuadro input!
0e nos abre el cuadro input 4entrada8, es a"& escribimos nuestra entrada, en este caso
*emos que el programa contestó 10, dándonos una respuesta correcta
Introducir un número desde cuadro de texto input del programa
%"ora ya le&mos un dato desde teclado, pero es importante saber como leer dos valores desde teclado omemos una función que "ace una operación cualquiera usando dos n+meros
g:loat -+ :loat -+ :loat g n t = - (7;(**n*t)) Es una función que toma dos n+meros, y le aplica la fórmula /6 4; < nt8 4/ < ; dividido = a la n por t )ero esta función requiere dos argumentos, debemos aprender como leer dos argumentos desde teclado >a sabemos que con n - getine leemos una variable llamada n y la función es un 5nput7uput ?sando los conocimientos descriptos en las páginas anteriores con la función g, cambiamos la función fac por g que es el nombre de la función nos estar&a quedando!
g:loat -+ :loat -+ :loat g n t = - (7;(**n*t)) main 2 () main = do n - getine pt4trn ('how (g (read n))) ambin tirar&a error, porque la función pide dos argumentos y es tamos dando uno solo. 2o que tenemos que "acer es decir que lea la variable que llamamos t dentro del parntesis de g que es la función g, escribiendo read t El programa correctamente escrito quedar&a as&! g:loat -+ :loat -+ :loat g n t = - (7;(**n*t)) main 2 () main = do n - getine t - getine pt4trn ('how (g (read n) (read t))) %"ora ponemos ambos valores en la caja de texto y le damos en ejecutar
El programa respondió 1.%%% que es el resultado de la operación Nota!
2os n+meros no se no se pueden introducir uno separado del otro, se debe escribir en l&neas separadas, una debajo de la otra, como muestra la imagen, de lo contario va a tirar error. error. 1on lo explicado anteriormente, es fácil deducir como se puede programar para introducir tres o más n+meros desde teclado, por ejemplo, para leer variables , y / se usar&a (read ) (read ) (read /)
7tra forma más genrica de escribir el main es la s iguiente!
main = 'trg $+ getine *+ getine ++= print where 'trg = flip ((flip (g . read)) . read) Este código 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á más adelante
Introducir un dato tipo cadena String desde el cuadro input del programa enemos la siguiente función 6er que lo que "ace es traducir una palabra al jeringoso
6e 4tring-+4tring 4tring-+4tring 6e >? = >? 6e (a')= if a==a @@ a==e @@ a==i @@ a==o @@ a== then apa6e(') el'e a6e (') :ecordar que ' indica lista, ya que un 4tring es una lista de caracteres, por lo tanto l a lectura en este caso tendr&a que ser xs, en el getline, en lugar de un carácter solo como ven&amos viendo, ya que un carácter solo se usa en el caso de ser una variable. )or lo tanto el 2 quedar&a de la siguiente manera!
main 2 () main = do ' - getine pt4trn ('how (6e (read '))) Nota!
2a palabra que se va a traducir a jeringoso debemos ingresarla entre comillas. Ejemplo la palabra ":aro" traducida al jeringoso ser&a ":aparopo"
1omo vemos, respondió de manera correcta. Poner carteles antes de respuesta )ara "acer al programa más amigable, podr&amos poner un cartel que nos informe acerca de la respuesta simplemente colocando un pt4trn arriba de la sentencia getLine, por ejemplo
main = do pt4trn "a palaAra en 6eringo'o e'" ' - getine pt4trn ('how (6e (read '))) @untando todo en una l&nea
pt4trn ("a palaAra en 6eringo'o e' " 'how (6e (read ')))
Lectura de listas de enteros
enemos la siguiente función igli't que devuelve Bre si ambas listas son iguales y :al'e en caso contrario
igli't >nt? -+ >nt? -+ Cool igli't >? >? = Bre igli't >? (a) = :al'e igli't (a) >? = :al'e igli't (a') (A') = if a==A then igli't(') (') el'e :al'e main 2 () main = do ' - getine ' - getine pt4trn ('how (igli't (read ') (read '))) :ecordar leer las dos listas con getine y de manera separada 1omo ya se aclaró en la nota, debemos leer cada l&nea por separado pero tambin debemos usar parntesis recto en ambas expresiones, por ejemplo, ejemplo, de la siguiente forma.
3a como resultado Bre que es el resultado correcto. 2o mismo ocurre si ingresamos solo un n+mero, tambin debemos "acerlo entre parntesis recto, pues indica lista, de lo contrario va a t irar error. Ejemplo! enemos las siguientes funciones, una de ellas 4 'mDigit') suma la cantidad de cifras de un numero
'plitDigit' nteger -+ >nteger? 'plitDigit' @ 10 = >? @ otherwi'e = ( EmodE 10) ('plitDigit' ( EdiFE 10)) 'mDigit' >nteger? -+ nteger 'mDigit' >? = 0 'mDigit' (') = ('m ('plitDigit' )) ('mDigit' ') main 2 () main = do ' - getine pt4trn ('how ('mDigit' (read '))) )ara calcular la cantidad de cifras del n+mero, por ejemplo A/B debemos ingresarlo >1&? y no 1& o "1&", pues en los dos +ltimos casos tirar&a error. 2a respuesta va a ser #, que es lo correcto
Lectura de tuplas desde cuadro de texto 2o que falta saber es como leer una tupla desde teclado. )or ejemplo, tenemos tenemos la función función f listada más abajo que devuelve una tupla con la lista y la tupla que suministra el usuario
combinando la lista con la tupla de modo que por cada elemento de la primera lista crea una tupla con el primer elemento de la segunda lista o sea (%( con C(D(,(1( Ejemplo! 3ada esta lista >"G","C","9","D"? y esta otra >>"C","9"?,>"G","9"?,>"G","C","D"?, >"9"?? devuelve esta lista de tupla! >("G","C"),("G","9"),("C","G" >("G","C"),("G","9"),("C","G"),("C","9"), ),("C","9"), ("9","G"),("9","C"),("9","D"),("D","9")? 0i somos observadores, notamos que en ejercicios anteriores cuando "ac&amos la lectura con getine y pt4trn con read no especificábamos el tipo de dato que le&amos, cuando se leen tuplas si es necesario especificar el ti po de dato que se lee, ya que Haskell no puede inferirlo, pues no está especificado en la cabecera de la función. )ara especificar el tipo de dato escribimos !! y el tipo de dato. Ejemplo! 0i queremos leer una variable de tipo entero "acemos!
read a nt 0i quisiramos leer por ejemplo una tupla de 0trings 4lista de caracteres separados por comas, o sea una cadena o String8 "acemos!
read a >4tring? )or otro lados la firma de la función read es read ead a =+ 4tring -+ a , 2eer un variable a implica 4 =+8 leer un variable 0tring y devolver otra variable 0u implantación en Haskell es la siguiente
f >a? -+ >>a?? -+ >(a,a)? f ' ' = >(,) @ (,/') - /ip ' ', - /'? 1uyo main es el que sigue
main 2 () main = do ' - getine ' - getine pt4trn ('how (f (read ' >4tring?) (read ' >>4tring??))) >>4tring?? ))) *a a dar >("G","C"),("G","9"),("C","G"), >("G","C"),("G","9"),("C","G"),("C","9"),("9"," ("C","9"),("9","G"),("9","C"), G"),("9","C"), ("9","D"),("D","9")? que es el resultado correcto. Nota!
En este ejercicio, el segundo parámetro puede ser omitido, pero para brindar más información decid& dejarlo
Bibliografía spa!ol
"ttps!##Fiki."askell.org#Es#Haskell$en$=$pasos
"ttp!##aprende"askell.es#content#ipos."tml
"ttps!##es.stackoverfloF.com#questions#A///G#leer6/6tuplas6desde6teclado6en6"askell6 online
"ttps!##es.stackoverfloF.com#questions#;G;#como6transformar6dos6listas6en6una6lista6 de6tuplas6en6"askell "ttps!##es.stackoverfloF.com#questions#A///G#leer6/6tuplas6desde6teclado6en6"askell6 online
Ingl"s
"ttps!##stackoverfloF.com#questions#AI/JI#output6integer6to6stdout6in6"askell