Funciones en Haskell
Hoy veremos lo que son las funciones en Haskell.
Recordemos que este lenguaje toma mucha inspiración de las Matemáticas. Por lo que veremos primero la definición de lo que es una función en Matemáticas.
Función matemática
Una función es: regla que asigna a cada valor de entrada un único valor de salida.
Ejemplo. Si defines una función que "a cada número le suma 3", entonces:
f(x) = x + 3 -- f(x) = y
Graficando una función matemática
Ahora imaginemos que tenemos esta tablita:
| Función f(x) | Valores de x | Resultado |
|---|---|---|
| f(x) = x + 3 | 2 | 5 |
| f(x) = x + 3 | 1 | 4 |
| f(x) = x + 3 | 0 | 3 |
| f(x) = x + 3 | -1 | 2 |
| f(x) = x + 3 | -2 | 1 |
Si graficamos la función tenemos lo siguiente:
Es importante conocer el concepto y definición de lo que es una función ya que en Haskell se inspira de esos conceptos matemáticos.
Función en Haskell
Veremos el concepto de función en Haskell. Una función es un bloque de código reutilizable que realiza una tarea específica. Se distingue de los procedimientos en que sí devuelve un valor.
Función en Haskell
Una función toma un valor de argumento (o parámetro ) y devuelve un valor de resultado (esencialmente lo mismo que en las funciones matemáticas). Definir funciones en Haskell es como definir una variable, excepto que tomamos nota del argumento de la función que colocamos a la izquierda del signo igual.
Ejemplo 1. Crearemos una función llamada ``suma`` para sumar dos números enteros (Integer).
suma.hs
suma :: Integer -> Integer -> Integer suma x y = x + y
Observemos la siguiente tabla:
| Componente | Ejemplo | Descripción |
|---|---|---|
| Firma de tipo | suma :: Integer -> Integer -> Integer |
Declara que la función suma recibe dos números enteros (Integer) y devuelve la suma de ambos. |
| Definición | suma x y = x + y |
Regla: asigna los dos parámetros enteros a la expresión x + y |
| Uso | suma 4 5 -- la suma da 9 |
Evalúa la función pasando los valores 4 y 5 como argumentos dando como resultado un 9 |
En esta tabla podemos descomponer en sus partes esenciales la función ``suma`` además de cómo emplearla.
Ejemplo 2. Crearemos una función llamada ``triple`` para triplicar un número entero (Integer).
triple.hs
triple :: Integer -> Integer triple num = num * 3
Veamos la composición de esta función:
| Componente | Ejemplo | Descripción |
|---|---|---|
| Firma de tipo | triple :: Integer -> Integer |
Declara que la función triple recibe un número entero (Integer) y devuelve la el triple de ese número. |
| Definición | triple num = num * 3 |
Regla: asigna los dos parámetros enteros a la expresión num * 3 |
| Uso | triple 5 -- el triple de 5 es 15 |
Evalúa la función pasando el valor 5 como argumento dando como resultado un 15. |
Funciones matemáticas y funciones en Haskell
Aunque teóricamente una función en Haskell es lo más cercano a lo que es una función matemática, existen diferencias importantes. Comencemos con sus semejanzas.
Semejanzas
Entre las semejanzas encontramos:
- Determinismo (Pureza): Para los mismos argumentos de entrada, ambas devuelven siempre el mismo resultado. No dependen ni modifican estados externos.
- Sin efectos secundarios: Una función en ambos ámbitos realiza un cálculo sin alterar el entorno (no modifican variables globales, datos externos ni registros).
- Transparencia referencial: Una llamada a una función puede reemplazarse directamente por su valor resultante sin cambiar el significado del cálculo. Si $f(x) = 10$, reemplazar $f(x)$ por $10$ es idéntico.
- Composición: Se pueden combinar funciones para crear nuevas funciones. En matemáticas es $(f \circ g)(x) = f(g(x))$; en Haskell se escribe (f . g) x.
- Funciones de orden superior: Ambas admiten recibir otras funciones como argumentos o devolver funciones como resultado (por ejemplo, la derivada en matemáticas o map en Haskell).
Diferencias
Observemos la siguiente tabla que pone en manifiesto sus diferencias:
| Característica | Función Matemática | Función en Haskell |
|---|---|---|
| Dominio y Codominio | Definidos sobre conjuntos matemáticos (enteros, reales, etc.), que pueden ser continuos e infinitos. | Definidos sobre tipos de datos finitos computacionales (Int, Float, String), limitados por la memoria y hardware. |
| Evaluación (Cómputo) | Expresa una relación o regla lógica. No requiere un proceso de ejecución ni tiempo de cómputo. | Requiere un algoritmo ejecutable por una máquina. Utiliza evaluación perezosa (lazy evaluation). |
| Recursión y Terminación | No contempla la no terminación; una función matemática siempre mapea un valor a otro. | Puede entrar en un bucle infinito si la definición recursiva no alcanza un caso base. |
| Parcialidad / Excepciones | La función requiere un dominio bien restringido para evitar indefiniciones. | Puede ser una función parcial que provoque un error en tiempo de ejecución para ciertas entradas si no se cubren todos los casos. |
| Curryficación | Puede definirse tomando múltiples variables a la vez como tuplas $f(x, y)$. | Todas las funciones son curryficadas por defecto: toman un argumento y devuelven una función que espera el siguiente. |
Podríamos expandir la explicación sobre funciones, pero es suficiente por hoy. Continuaremos en próximas entregas.
Enlaces:
https://en.wikibooks.org/wiki/Haskell/Variables_and_functionshttps://www.mateguapo.com/que-es-una-funcion
http://aprendehaskell.es/content/Funciones.html
https://www.cs.us.es/~jalonso/cursos/i1m/doc/Funciones_basicas.html





Comentarios
Publicar un comentario