Haskell, ¿donde esta for?.

Vamos a ir desarrollando pequeños programas en Haskell, para que podáis aprender conmigo a programar en este lenguaje. Nos servirá para aprender juntos y motivarnos a seguir escribiendo código.

Hoy vamos a crear un ejemplo básico pero instructivo, crearemos un programa para generar números primos, pero para los que vengáis de otros sistemas echareis de menos algo que siempre habéis usado, el muy conocido “for”, tan usado en otros lenguajes.

¿Deberiamos tener for en haskell?

Si vienes de otros lenguajes, la primera piensas que algo pasa, que no puede ser ¿como no puede haber for aquí? La respuesta es sencilla, por que no lo necesitamos, la programación funcional nos da unas herramientas muy potentes que nos harán olvidar a nuestro querido for.

Los que tengáis una base de matemáticas importante estaréis acostumbrados a este tipo de expresiones.

mathrm{mathsf{mathrm{S={2cdot xleft|: xinmathbb{N},: xleq10right.}}}}

En haskell gracias a las listas intencionales podemos definir conjuntos de una forma similar. [x*2 | x <- [1..10]]. Este ejemplo ha sido sacado de una de las mejores guías de Haskell en castellano: http://aprendehaskell.es/

Programar sin for.

El programa de ejemplo nos permitirá calcular los números primos entre 1 y otro que nosotros definamos.

Un número es primo cuando solamente es divisible por la unidad y por el mismo. 17 seria primo. 12 no lo seria, es divisible por 1,2,3,4 y 6.

http://www.nukebull.com
— El código genera todos los números primos entre el 1 y n

— Definimos cuantos divisores tiene un número, exceptuando el numero 1 y el mismo, mediante la función mod (modulo entero)

divisores :: Int -> [Int]
divisores y = [x | x <- [2..y-1], mod y x == 0]

— Es la función nos muestra todos los números entre 1 y n que cumplen la condición de no tener divisores (excepto 1 y n).

numerosprimos :: Int -> [Int]
numerosprimos y = [x | x <- [1..y], (divisores x)== []]

— Pediremos un numero n por terminal mediante getLine

main = do
putStrLn “¿Hasta qué número desea buscar?”
n <- getLine
let num = read(n)

— Mostramos por pantalla nuestros resultados.


putStrLn “Aquí los tiene “
putStrLn (show(numerosprimos num))

Lo guardamos como NumerosPrimos.hs y ejecutamos.

runhaskell NumerosPrimos.hs
¿Hasta qué número desea buscar?
80
Aquí los tiene
[1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79]

Como podemos apreciar no hemos usado for, debemos aprender a enfrentarnos a los problemas de forma funcional.

2 comentarios sobre “Haskell, ¿donde esta for?.

  1. Muy buen artículo, pero para algunos el for y el if irán con nosotros hasta el fin de los días. De un nacido en Basic, educado en Fortran y Visual Basic, y ahora en arduino.

    Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s