Haskell Hero

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

Expresiones

¿Qué es una expresión?

La expresión es todo lo que Hugs toma sin quejas y que no es una orden.

5 + 2 es una expresión.

7 es una expresión.

"Haskell" es una expresión.

'c' es una expresión.

even 5 es una expresión.

En el método de cajas vamos a enunciar las expresiones con varios cuerpos geométricos (un cilindro, un prisma, también podéis esperar un tren). Vamos a explicarlo más tarde.


La representación de expresiones con cajas

La notación de prefijo / infijo

En Haskell usamos dos tipos de notaciones de expresiones. La de prefijo y la de infijo. Ejemplos:

La notación infija: 3 + 5


La notación infija

La notación prefija: div 8 3


La notación prefija

3 + 5 leemos [3 más 5]

div 8 3 leemos [la función div y los parámetros 8 y 3]

Los signos que identifican funciones unarias o binarias también pueden llamarse operadores. Conocemos dos tipos de operadores:

  • alfanuméricoque consta de letras y números, por ejemplo funciones div y mod.
  • no alfanumérico +,^.

Todas las expresiones escritas en la notación infija también se pueden escribir en la notación prefija. Al revés funciona solo con funciones binarias.

La expresión en la notación infija con un operador no alfanumérico la convertimos a la notación prefija de esta manera: ponemos el operador entre paréntesis y lo escribimos delante de los parámetros.

3 + 5  ==>  (+) 3 5

La expresión en notación prefija con el operador alfanumérico la convertimos a la notación infija de esta manera: ponemos el operador entre acentos hacia la derecha.

div 8 3  ==>  8 `div` 3

No hay diferencia en el cálculo entre la notación infija y prefija. Podéis probarlo en Hugs. Ambas son procesadas de misma manera, solo las funciones escritas en notación prefija tienen una prioridad más alta. Esto significa que en la expresión

3 * div 5 2

se calcula primero la división entera que está escrita en notación prefija y después la multiplicación escrita en notación infija.

Subexpresiones

Todas las expresiones las podemos dividir en subexpresiones. Ejemplo: 3 + 5

Para la mejor división de la expresión en subexpresiones convertimos la expresión a la notación prefija.
(+) 3 5

Subexpresiones son:

  • la función y sus parámetros (+) 3 5, que son tres expresiones

  • la función con uno de sus parámetros, la función con sus dos parámetros, ..., la función con sus n parámetros
    (+) 3 5
    (+) 3 5
La expresión 3 + 5 tiene 5 subexpresiones en total.


La expresión más compleja: (zipWith (*) [1,2] [3,4]) ++ [5,6]

  • la convertiremos a la notación prefija:
    (++) (zipWith (*) [1,2] [3,4]) [5,6]

  • la función (++) sus dos parámetros, 3 subexpresiones en total
    (++) (zipWith (*) [1,2] [3,4]) [5,6]

  • la función (++) su primer parámetro, una subexpresión
    (++) (zipWith (*) [1,2] [3,4]) [5,6]

  • la función (++) con sus dos primeros parámetros, es lo que a la expresión total, una subexpresión
    (++) (zipWith (*) [1,2] [3,4]) [5,6]

  • la función (++) y su parámetro [5,6] ya no se pueden dividir más, por eso vamos a dividir ahora la subexpresión
    zipWith (*) [1,2] [3,4]:

    • la función zipWith y sus 3 parámetros, 4 subexpresiones
      zipWith (*) [1,2] [3,4]

    • la función zipWith con su primer parámetro, una subexpresión
      zipWith (*) [1,2] [3,4]

    • la función zipWith con sus dos primeros parámetros, una subexpresión
      zipWith (*) [1,2] [3,4]

    • la función zipWith con sus tres primeros parámetros, lo que es la expresión total que ya hemos incluido antes

La expresión (zipWith (*) [1,2] [3,4]) ++ [5,6] tiene entonces 11 subexpresiones.