Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Funcional
No hay, una acepción precisa del término "funcional", que etimológicamente se ajuste
a su aplicación en este contexto. Pero cuando decimos que Haskell es un lenguaje
funcional, solemos tener en cuenta dos cosas:
Las funciones tienen aquí preponderancia, y estas se pueden utilizar de la
misma forma que cualquier otro tipo de valor.
Los programas Haskell se centran en la evaluación de expresiones, en lugar
de ejecutar instrucciones.
Esto resulta en una forma completamente diferente de pensar a la programación.
Puro
Perezoso
En Haskell, las expresiones no se evalúan, hasta que sus resultados son realmente
necesarios. Esta es una característica sencilla, con consecuencias de gran alcance,
lo cual vamos a explorar. Algunas de las consecuencias son:
Es fácil reemplazar las estructuras de control, sólo mediante la definición de
una función.
Es posible definir y trabajar con estructuras de datos infinitas.
Permite un estilo de programación más composicional (ver programación
integral más abajo).
Tipos
Tipado estáticamente
Cada expresión Haskell tiene asociado un tipo, dichos tipos son controlados en tiempo
de compilación. Los programas con errores de tipo no corren, ni siquiera se compilan
exitosamente.
Los sistemas de tipos estáticos pueden parecer tediosos. De hecho, pasa también
en lenguajes como C ++ y Java. Pero esto se debe a que los sistemas de tipo estático
como el C ++ y Java son insuficientemente expresivos6. Vamos a echar un vistazo
de cerca al sistema de tipos de Haskell, que:
Ayuda a clarificar el pensamiento y a estructurar un programa expresivo.
El primer paso para escribir un programa Haskell suele ser anotar todos los
tipos. Porque el sistema de tipos de Haskell es expresivo, este es una etapa
no trivial del diseño.
Sirve como una forma de documentación cuando un sistema es expresivo, sólo
al mirar el tipo de una función dice mucho acerca de lo que esta puede hacer y
6
Un programa fuente es expresivo cuando no hace falta aclarar nada, sino que se entiende con solo leerlo.
Un lenguaje es expresivo si permite crear programas fuentes expresivos.
Inferencia de Tipos
Abstracción
Programación integral
La programación integral implica pensar en grande: trabajar con una lista completa,
en lugar de una secuencia de elementos; desarrollar un espacio de soluciones, en
lugar de una solución individual; imaginar una trayectoria, en lugar de un tramo de
esta. El enfoque integral a menudo ofrece nuevos puntos de vista u ofrecen nuevas
perspectivas sobre un problema dado. Está muy bien complementado por la idea de
la programación proyectiva: primero resolver un problema más general, a
continuación, extraer las partes y piezas interesantes mediante la transformación del
programa general en otras más especializadas.
Este código tiene que preocuparse por los detalles de bajo nivel de iteración del
arreglo mediante el seguimiento de un índice. También se mezcla lo importante con
lo accesorio necesarios para implementar el ciclo repetitivo.
En Haskell, se crea un programa fuente con las siguientes sentencias:
Declaraciones y Variables
Dicho de otra manera, el símbolo ‘=’ no denota asignación, tal com sucede en
muchos otros lenguajes imperativos. Sino que denota una definición, como se lo hace
en matemática. Es decir, x = 4 no debería leerse como "4 es asignado a x" o "asignar
a x un 4", sino como "x se define como 4" o “x es 4”.
y :: Int
y = y + 1
main = print y
Debido a que = denota definición en lugar de asignación, esta no se incrementa el
valor de y. En su lugar, esta afirmación se toma como una definición recursiva.
y = y + 1
= (y + 1) + 1
= ((y + 1) + 1) + 1
=
.
.
.
En definitiva, el resultando es un loop infinito y el consiguiente error:
Tipos básicos
-- Enteros dependientes de la arquitectura e implementación
i :: Int
i = -78
32 32
Los Int del lenguaje Haskell estándar garantizan valores en rango [-(2 ) .. (2 -1)]
sin embargo, el tamaño exacto depende de la arquitectura. Se puede encontrar el
rango específico de una arquitectura eimplementación particular mediante la
evaluación siguiente:
7
Note que Haskell utiliza la convención CamelCase en la forma de darle nombre a los identificadores
-- Booleanos
b1, b2 :: Bool
b1 = True
b2 = False
-- caracteres Unicode
c1, c2, c3 :: Char
c1 = 'x'
c2 = 'Ø'
c3 = 'ダ'
Los valores booleanos se pueden comparar con (&&), (| |), y not (and, or y not lógicos,
respectivamente).