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_functions
https://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

Entradas populares de este blog

Cabal

Lenguajes similares Haskell: Agda

Tipos de datos en Haskell