Haskell Hero

Haskell Hero es un manual interactivo del lenguaje Haskell para principiantes.

Conocimientos básicos

En general

El contenido de esta lección no hay que estudiarlo a fondo. Es más como un resumen de nociones básicas que hay que saber para las próximas lecciones. Recomiendo que lo leáis rápidamente por primera vez y después podéis volver a leerlo si es necesario.

Case sensitive

Para Haskell el tamaño importa. Es muy diferente escribir en Hugs miFunción o MiFunción.

  • Cosas que se escriben con letra minúscula:
    • el nombre de la función: miFunción, f, fact
    • los parámetros de la función: x, y, altura, anchura
    • la identificación de tipos polimórficos: a, b, c
  • Cosas que se escriben con letra mayúscula:
    • el nombre de tipo: Integer, Char, String
    • los valores de bool: True, False

La distinción entre letras mayúsculas y minúsculas no es solo un acuerdo de los programadores, sino que Hugs verdaderamente sigue la distinción. Si escribimos para evaluar la expresión

False
Hugs la interpreta como un valor de verdad, identifica que esta expresión ya no se puede simplificar y recibimos como resultado False de nuevo.

Sin embargo, si escribimos False con letra minúscula, es decir

false
Hugs nos dice que no conoce tal variable/función.

Tipos y estructuras de datos

n tipo es una colección de valores relacionados. Se desarrollará más en la lección Tipos.

En nuestro manual vamos a trabajar son siguientes tipos y estructuras:

  • Números enteros: 8, 5, -3, 0
  • Números decimales: 8.5, -5.8, 3.0
  • Valores booleanos: True, False
  • Caracteres: 'c', 'á', '&' (usamos apóstrofos)
  • Cadenas de caracteres:
    "Haskell"
    "@&!#P961"
    "123987"          -- usamos comillas dobles
    
  • Duplas, triplas,...:
    (1,2)
    ('a',8.4,"VerDaD")
    ("Haskell",False,4,'@')
      -- usamos paréntesis y separamos con comas
    
    Duplas se forman con el operador (,), triplas con el operador (,,), cuádruplas con el operador (,,,), etc.
    (,) 1 2             ~>  (1,2)
    (,,) True 'v' 10.5  ~>  (True, 'v', 10.5)
    
  • Listas:
    [1,2,3,4,5]
    ['f','&','Q','!']
    [("Juan",15),("Miguel",28),("Cristina",32)]
    [[7,9,4],[1],[8,56,12,14],[]]
      -- usamos corchetes, separamos con comas
    

Aridad de la función

La aridad es una característica de funciones que indica cuantos parámetros necesita la función para su evaluación completa.

  • Función de aridad 1 (función unaria) necesita solo un parámetro para evaluarse completamente. Una muestra puede ser por ejemplo la función odd, que identifica si el número escrito como parámetro es impar.
  • Función de aridad 2 (binaria) es por ejemplo la función (+) que suma dos números y devuelve el resultado.
  • También hay funciones de aridad 3 (ternarias) que para su evaluación completa necesitan tres parámetros.
  • Tenemos también funciones nularias que son o constantes, es decir expresiones irreducibles que ya son evaluadas completamente, o expresiones que se pueden reducir y que se evalúan siempre al mismo valor.

En el modelo de cajas, la aridad de función coincide con el número de agujeros en la cara superior de la caja.


La función unaria f, la función binaria g y la función ternaria h

if-then-else

En Haskell hay una construcción
if condicion then cumplido else no cumplido
donde
  • condicion es una expresión que se evalúa a True o False
  • cumplido es una expresión que evalúa la expresión if-then-else si se cumple la condición
  • no cumplido es una expresión que evalúa la expresión if-then-else si no se cumple la condición

Algunas características importantes de las expresiones if-then-else:
  • En Haskell no hay una construcción
    if condicion then cumplido
    
    En la programación funcional queremos que todas las expresiones se puedan evaluar. Si no indicásemos como se evalúa la expresión si no se cumple la condición, el cálculo no podría seguir.
  • Las expresiones cumplido y no cumplido tienen que ser del mismo tipo. Si por ejemplo la expresión cumplido es un número, la expresión no cumplido también debe ser un número.

Ejemplo:

Escribid una expresión que identifique si 5 es un número par. Si lo es, que la expresión se evalúe a la letra 'A' y si no, que la expresión se evalúe a la letra 'N'.


Como la condición, ponemos la expresión even 5, en la parte que se realiza después de que la condición se cumpla, ponemos 'A' y en la otra parte ponemos 'N'. La expresión final será la siguiente:

if even 5 then 'A' else 'N'
lo que se evalúa a:
   if even 5 then 'A' else 'N'
~> if False then 'A' else 'N'
~> 'N'

Comentarios

En el código fuente también podemos escribir nuestras notas, ya que el intérprete las va a ignorar. Comentarios los escribimos empezándolos con dos rayas --. Todo desde las dos rayas hasta el fin de la línea no se va a compilar.

el código del programa  -- comentario que se va a ignorar durante la compilación
el otro código del programa

Los comentarios también los podemos usar para evitar la compilación de una parte del código.

f 0 = 0
-- f 1 = 1   esta línea como si no estuviese aquí
f x = x + 1
Este uso de comentarios es muy útil cuando depuramos un programa. Cuando queremos que una parte del código no se compile pero no sabemos si no la vamos a necesitar en el futuro, en vez de borrarla solo la ponemos en comentario. Después la hacemos disponible con solo quitar las rayas.

Si necesitamos hacer un comentario de más líneas, lo ponemos entre caracteres {- y -}.

el código del programa {- comentario comentario
comentario
comentario
-}
el otro código