Haskell Hero

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

Evaluación

¿Qué es la evaluación?

La evaluación de expresiones es muy importante en la programación funcional. Tenemos que darnos cuenta de que en el momento en que escribimos una expresión en Hugs para evaluar, ya le ponemos el resultado del cálculo en cierta forma. Hugs toma este resultado escrito en cierto modo y lo convierte en una forma que ya no se puede simplificar.

Por ejemplo 3 + 5 es una expresión que se puede simplificar a la expresión irreducible 8. Esta simplificación la señalamos con ~>. La simplificación de la expresión anterior la escribiríamos como 3 + 5 ~> 8.

Evaluamos

Por supuesto todas las expresiones no se evalúan en un paso. Por ejemplo la evaluación de la expresión 3 + 5 * 2 a una forma irreducible se hace en dos pasos:

3 + 5 * 2  ~>  3 + 10  ~>  13

Si queremos indicar que una expresión se simplificó en dos pasos pero no queremos mencionar el paso intermedio, escribimos:

3 + 5 * 2  ~>²  13

Lo podemos hacer de misma manera cuando queremos escribir que una expresión se simplificó en tres pasos:

3 * 4 + 2 * 5  ~>³  22
etc.

Si queremos escribir que una expresión se simplificó y nos da igual en cuantos pasos, en vez de un número ponemos sobre la flecha una estrella: ~>*.

Prioridad de operadores y dirección de asociación

Podemos preguntar "Cómo Hugs sabe en la evaluación de la expresión 3 + 5 * 2 que la multiplicación tiene preferencia a la adición?" Es muy fácil. Hugs sigue la siguiente tabla que indica que operación tiene preferencia de las otras. Operaciones con una prioridad más alta se realizan antes de las con la prioridad baja.

La adición es de prioridad 6, la multiplicación de prioridad 7, lo que significa que la multiplicación se realiza antes de la adición. La expresión anterior se evaluaría entonces:

3 + 5 * 2  ~>  3 + 10  ~>  13

Si queremos conseguir que la adición se haga antes de la multiplicación, ponemos 3 + 5 entre paréntesis: (3 + 5) * 2

La notación prefija siempre tiene preferencia a la notación infija. En la expresión (+) 3 5 * 2 se evalúa primero la adición y después la multiplicación.

(+) 3 5 * 5 ~> 8 * 5 ~> 40

También nos gustaría saber si la expresión 3 ^ 3 ^ 3 se evaluaría como 3 ^ (3 ^ 3) o como (3 ^ 3) ^ 3. La tabla soluciona este problema también. En concreto la columna Dirección de asociación. La elevación asocia de la derecha a la izquierda, es decir la expresión anterior se evaluaría como 3 ^ 3 ^ 3 ~> 3 ^ 27 ~> 7625597484987.

Prioridad Dirección de asociación Operadores
9 .
9 !!
8 ^
7 * / `div` `mod`
6 + -
5 : ++
4 == /= < <= > >= `elem` `notElem`
3 &&
2 ||