2
3
4
4
5
7
9
12
16
17
20
24
HASK
ELL & HUGS
I.N.E.T. 2.
Temas de Introducción
Definición de Lenguajes
. Lenguaje Natural
. Lenguaje Computacional
. Lenguajes Imperativos
. Lenguajes Funcionales
Para QUÉ y QUIÉNES utilizan Lenguajes Funcionales
Glosario Inicial
Haskell Lenguaje Funcional de Programación
Introducción a Hugs
Sistema de INFERENCIA de TIPOS
Haskell Platform 2011.2.0.0 versión GHCi
Identificadores y Operadores
Precedencias y Asociatividad
Haciendo clik encima del número del índice se dirige
10
13
directamente al tema.
Propósito General:
El propósito de realizar ésta presentación, no es la exposición dogmática y docta del tema Haskell &
Hugs, sino todo lo contrario, acercar al estudiante que por primera vez se ve enfrentado a un lenguaje
de programación, sin tener formación previa y requiere de una terminología específica acompañada de
las definiciones lo más allegadas a su entendimiento posible para acercarse a la abstracción del lenguaje
computacional.
ADOLFO MONTIEL VALENTINI ©
y
HASK
ELL & HUGS
I.N.E.T. 3.
LENGUAJES:
Lenguaje Natural =
lenguaje humano, es un conjunto arbitrario
de símbolos, socialmente aceptados, no instintivo de comunicar ideas, es
un instrumento de expresión y significación social, construido
socialmente.
Lenguaje Computacional =
Los lenguajes de programación
son un conjunto acotado (finito) de palabras y signos , interrelacionados
por medio de reglas. Son lenguajes inventados para controlar las
respuestas de una máquina dada.
Clasificación de Lenguajes Computacionales
Los lenguaje de computación se pueden clasificar de diversas maneras. A
los efectos del tema los clasificaremos en dos grandes grupos:
Lenguajes Imperativos
Lenguajes Funcionales
VOLVER AL INDICE
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 4.
Lenguajes Imperativos
Lenguajes de Programación IMPERATIVA o Tradicional*, dónde lo
importante es la secuencia de pasos , acciones y condiciones, para llegar
a un resultado previsible. Se basa en estructuras, variables e
instrucciones de repetición.
Sentencias Imperativas
x := 5
Sentencias declarativas (funcionales)
function f(int x) { return x+1;}
La distinción entre construcciones imperativas y declarativas se basa en la
distinción entre cambiar un valor existente y declarar un nuevo valor.
{ int x=1; /* declara una nueva variable x */
x = x+1; /* asigna un valor a x */
{ int y=x+1; /* declara una nueva variable y */
{ int x=y+1; /* declara una nueva x */
}}}
VOLVER AL INDICE
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 5.
Lenguajes Imperativos:
Los lenguajes de programación tradicionales como Pascal , C, C++, ADA, Java,
entre otros forman una abstracción de la máquina de Von-Neumann
caracterizada por:
Memoria principal para almacenamiento de datos y código máquina.
Unidad Central de Proceso (CPU) con una serie de registros de
almacenamiento temporal y un conjunto instrucciones de cálculo
aritmético, modificación de registros y acceso a la memoria principal.
Los programas imperativos poseen una serie de datos globales y una
secuencia de comandos ó código. Estos dos elementos forman una abstracción
de los datos y código de la memoria principal. Para hacer efectiva dicha
abstracción se compila el código fuente para obtener código máquina.
El modelo imperativo tiene gran proximidad a la arquitectura de los
computadores convencionales.
VOLVER AL INDICE
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 6.
Lenguajes Imperativos:
El programador trabaja en un nivel cercano a la máquina que le permite
generar programas eficientes. Con esta proximidad aparece, sin embargo,
una dependencia entre el algoritmo y la arquitectura que impide, por
ejemplo, utilizar algoritmos programados para arquitecturas secuenciales
en arquitecturas paralelas.
Los algoritmos en lenguajes imperativos se expresan mediante una
secuencia de órdenes que modifican el estado de un programa
accediendo a los datos globales de la memoria.
Las instrucciones de acceso a los datos globales destruyen el contenido
previo de un dato asignando un nuevo valor. Las asignaciones introducción
al lenguaje Haskell producen una serie de efectos laterales que oscurecen
la semántica del lenguaje.
VOLVER AL INDICE
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 7.
LENGUAJES FUNCIONALES de PROGRAMACIÓN:
Lenguajes FUNCIONALES o Programación Funcional, tienen por fundamento
las funciones como estructuras de control.
El modelo funcional, tiene como objetivo la utilización de funciones
matemáticas puras sin efectos laterales y por tanto, sin asignaciones
destructivas.
Se caracterizan por la utilización de funciones sobre los elementos de primer
orden, así como de la utilización de funciones polimórficas, funciones de
orden superior, evaluaciones perezosas y definiciones de listas por
comprehensión.
El valor que devuelve una función está únicamente determinado por el valor
de sus argumentos consiguiendo que una misma expresión tenga siempre el
mismo valor (esta propiedad se conoce como transparencia referencial). Es
más sencillo demostrar la corrección de los programas ya que se cumplen
propiedades matemáticas tradicionales como la propiedad conmutativa,
asociativa y otras.
VOLVER AL INDICE
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 8.
LENGUAJES FUNCIONALES de PROGRAMACIÓN:
El programador se encarga de definir un conjunto de funciones sin
preocuparse de los métodos de evaluación que posteriormente utilice el
sistema. Este modelo deja mayor libertad al sistema de evaluación para
incorporar pasos intermedios de transformación de código y paralelización ya
que las funciones no tienen efectos laterales y no dependen de una
arquitectura concreta.
La importancia de la programación funcional no radica únicamente en no
utilizar asignaciones destructivas. Por el contrario, este modelo promueve la
utilización de una serie de características como las funciones de orden
superior, los sistemas de inferencia de tipos, el polimorfismo, la evaluación
perezosa y otras.
Se caracterizan por la utilización de funciones sobre los elementos de primer
orden, así como de la utilización de funciones polimórficas, funciones de
orden superior, evaluaciones perezosas y definiciones de listas por
comprehensión.
VOLVER AL INDICE
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 9.
Para QUÉ o QUIÉNES utilizan Lenguajes Funcionales:
Software AG, una de las mayores empresas de software en Alemania vende un
sistema experto.
Ericsson ha desarrollado un nuevo lenguaje de programación funcional Erlang®,
que se utilizará en sus aplicaciones de teléfonos celulares.
Query® es el lenguaje de sistema de base de datos orientado a objetos O2
ICAD Inc. Market un sistema CAD para ingeniería mecánica y aeronáutica.
VOLVER AL INDICE
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 10.
GLOSARIO INICIAL:
1. Elementos de primer orden (first class): o Argumentos, son el conjunto de
instrucciones lógico-matemáticas, muy precisas, para resolver la función (1ª línea).
2. Tipo o Tipos de datos, es un atributo del conjunto de los datos o valores(dominio) que
indica la clase de datos sobre los que se van a procesar. Los tipos específicos se nombran
con mayúscula al inicio y los que denotan valores con minúscula: Integer, Bool, Char,
3. Tipificación (Typing): Es la relación del dato o valor con su dominio, ej.: 5:: Integer ;
´a´ :: Char; inc:: Integer -> Integer; [ 1,2,3 ] :: [ Integer]; (`b´, 4) :: (Char, Integer)
4. Tipo de una función (Type signature declaration): , es con la cual podemos dar de
forma explícita el tipo de una función: inc, inc :: Integer-> Integer (inc=increase)
5. Tipos Polimórficos, son cuantificadores universales sobre todos los tipos y describen
esencialmente familias de tipos, ej.: (para _todo a), [a] familia de listas que contienen a.
VOLVER AL INDICE
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 11.
GLOSARIO INICIAL:
6. Funciones Polimórficas: Son aquellas que pueden evaluarse o ser aplicadas a diferentes
tipos de datos de forma indistinta y tienen sentido para más de un tipo. [Integer], [Char], o
[[Integer]].length [1,2,3] = > 3 length [`a´, `b´, `c´ ] = > 3 length [[1], [2], [3]] = > 3
6. Tipo definido por el usuario, debe iniciarse también con minúscula, seguido de del tipo
de dato, ej.: miEvento :: Int -> Bool (tipo de chequeo)
6. Evaluaciones Perezosas: significa haz lo solo que que te pida un patrón a la izquierda de
una ecuación o cuantificador (Where o Let). No evalúes toda la expresión (evaluación no
estricta).
7. Encaje por patrones: Las funciones son un tipo de operadores de prioridad mayor regido
por la asociatividad izquierda que establece patrones que cumplen con las propiedades
matemáticas tradicionales: Conmutativa, asociativa, etc.
8. Listas por comprehensión: El operador no está obligado a declarar el tipo de expresiones,
el compilador contiene un algoritmo que infiere el tipo de las expresiones. Si el programador
declara el tipo de alguna expresión el sistema corrobora si el tipo declarado coincide con el
tipo inferido.
Ej.: eligeSaludo x = if x then adios
else hola
eligeSaludo :: bool -> String
el compilador notará
(arrays)
VOLVER AL INDICE
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 12.
HAS KEL
LENGUAJE FUNCIONAL de PROGRAMACIÓN:
El lenguaje Haskell (1987-1992) pretendió unificar las características más
importantes de los lenguajes funcionales como las funciones de orden superior,
evaluación perezosa, inferencia estática de tipos, tipos de datos definidos por el
usuario, encaje de patrones y listas por comprehensión. Al diseñar el lenguaje se
observó que no existía un tratamiento sistemático de la sobrecarga con lo cual se
construyó una nueva solución conocida como las clases de tipos. El lenguaje
incorporaba, además, Entrada/Salida puramente funcional y definición de arrays
por comprehensión.
En Mayo de 1996 aparecía la versión 1.3 del lenguaje Haskell [Has95] que
incorporaba, entre otras características, mónadas para Entrada/Salida, registros
para nombrar componentes de tipos de datos, clases de constructores de tipos y
diversas librerías de propósito general.
Posteriormente, surge la versión 1.4 con ligeras modificaciones.
En 1998 se ha decidido proporcionar una versión estable del lenguaje, que se
denominará Haskell98 a la vez que se continúa la investigación de nuevas
características.
VOLVER AL INDICE
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 13.
Cuando se inicia WinHugs 98, se obtiene una ventana de sesión.
Después del mensaje de bienvenida, al inicio cada línea verá la palabra Hugs98
esto es un prompt, un indicador del estado de procesamiento.
En esta ventana podrá digitar cualquier tipo de expresión matemática y podrá
ver el resultado de esta presionando intro (enter). Una vez que el cálculo es
computado y el resultado es mostrado, el prompt aparecerá nuevamente. Esto
nos indicará que el intérprete está listo para recibir más instrucciones.
No se debe olvidar que el lenguaje o notación en que se escriben las expresiones es
Haskell.
VOLVER AL INDICE
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 14.
Conceptos básicos
El entorno HUGS funciona siguiendo el modelo de una calculadora en el que se establece una
sesión interactiva entre el ordenador y el usuario. Una vez arrancado, el sistema muestra un
prompt "?" y espera a que el usuario introduzca una expresión (denominada expresión
inicial y presione la tecla . Cuando la entrada se ha completado, el sistema
evalúa la expresión e imprime su valor antes de volver a mostrar el prompt para esperar a que
se introduzca la siguiente expresión.
Ejemplo:
(2+3)*8
40
En el primer ejemplo, el usuario introdujo la expresión "(2+3)*8" que fue evaluada por
el sistema imprimiendo como resultado el valor "40".
VOLVER AL INDICE
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 15.
sum [1..10]
55
En el segundo ejemplo, el usuario tecleó "sum [1..10]".
La notación [1..10] representa la lista de enteros que van de 1 hasta 10, y sum es una
función estándar que devuelve la suma de una lista de enteros. El resultado obtenido
por el sistema es:
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55
Por ejemplo, puede introducir algunas expresiones aritméticas simples:
Hugs> 1+3-2 2
-18
y también otras no tan simples:
Hugs> 15*0.30+20*0.30+19*0.40
18.1
Este último ejemplo calcula el promedio ponderado de tres notas, asignando un peso
de 30% a las dos primeras y 40% a la última.
Hugs conoce muchas funciones y operadores que pueden ser usados en estas
expresiones. Ellas están definidas en un archivo llamado Prelude, el cual sólo es un
programa Haskell (Prelude .hs) que contiene una colección de definiciones de
funciones.
VOLVER AL INDICE
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 16.
Haskell es un lenguaje funcional con un SISTEMA DE INFERENCIA DE TIPOS que consiste en:
– El programador no está obligado a declarar el tipo de las expresiones
– El compilador contiene un algoritmo que infiere el tipo de las expresiones
– Si el programador declara el tipo de alguna expresión, el sistema chequea que el tipo
declarado coincide con el tipo inferido.
Los sistemas de inferencia de tipos permiten una mayor seguridad evitando errores de tipo
en tiempo de ejecución y una mayor eficiencia, evitando realizar comprobaciones de tipos
en tiempo de ejecución.
Por ejemplo, si el programador declara la siguiente función:
eligeSaludo x = if x then "adios"
else "hola"
El sistema infiere automáticamente que el tipo es eligeSaludo::Bool -> String y, si el
Programador hubiese declarado que tiene un tipo diferente, el sistema daría un error de
tipos.
VOLVER AL INDICE
ADOLFO MONTIEL VALENTINI ©
referiremos siempre
actualizada.
HASK
ELL & HUGS
I.N.E.T. 17.
Haskell Platform
2011.2.0.0 versión GHCi
La versión Haskell Platform
2011.2.0.0 GHCi (Glasgow
Haskell Compiler), provee
un entorno similar a las
versiones anteriores, pero
con un acceso inmediato a
Prelude, lo que nos
proporciona una variedad
mucho más amplia de
soluciones preestablecidas.
En adelante nos
En la nueva plataforma de Haskell, llamada WinGHCi 2011,
respecto a la versión más la cual evolucionó desde la plataforma Winhugs 98, cuya
versión actual es la 7.0.2,se tiene acceso directamente a una
ventana de sesión con una amplia colección de valores,
funciones, tipos y operadores predefinidos bajo WinGHCi
Prelude (Prelude = preludio, precede y sirve de entrada),
VOLVER AL INDICE
como evaluador.
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 18.
Haskell Platform
2011.2.0.0 versión
GHCi
Prelude> es nuestra línea de
comandos donde podemos
ejecutar directamente los
programas.
El programa que muestra
Hola Mundo en Haskell es:
putStrLn "Hola Mundo"
Hola Mundo
Prelude> 1+3
4
Prelude> 2*3
6
Prelude> 2^3
8
Prelude> putStrLn "Hola Mundo"
Hola Mundo
Lo más sencillo que podemos plantear luego del Hola Mundo es la
ejecución de operaciones matemáticas:
Prelude> 1+3
4
Prelude> 2*3
6
VOLVER AL INDICE
Prelude> 2^3
8
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 19.
Podemos también generar un
archivo independiente con
nuestro programa en Haskell,
utilizaremos el NotePad para ello:
main = putStrLn "Hola Mundo Haskell"
Luego de codificarlo lo grabamos
con extensión hs (ejemplo1.hs) y
desde el entorno de Haskell
procedemos a recuperar el
archivo mediante las opción:
File -> Load y lo ejecutamos mediante
la opción Actions -> Runmain
Como vemos es muy sencillo
proceder a crear un archivo
independiente con nuestro
programa en Haskell (también
podemos generar un ejecutable
(exe) seleccionando la opción
Tools -> GHC compiler)
main = putStrLn "Hola Mundo Haskell"
putStrLn "Hola Mundo"
Hola Mundo
VOLVER AL INDICE
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 20.
IDENTIFICADORES Y OPERADORES:
Existen dos formas de nombrar una función, mediante un
identificador (por ejemplo, sum, product y fact) y mediante
un símbolo de operador (por ejemplo, * y +) El sistema
distingue entre los dos tipos según la forma en que estén
escritos:
Un identificador comienza con una letra del alfabeto
seguida, opcionalmente, por una secuencia de caracteres,
cada uno de los cuales es, una letra, un dígito, un apóstrofe
(') o un subrayado (_).
Los identificadores que representan funciones o variables
deben comenzar por letra minúscula (los identificadores que
comienzan con letra mayúscula se emplearán como
funciones constructoras). Los siguientes son ejemplos de
posibles identificadores:
sum f f'' intSum elemento_dos do'until'zero
Los siguientes identificadores son palabras reservadas y no
Pueden utilizarse como nombres de funciones o variables:
case of, where, let in, if then, else, data type, infix, infixl,
infixr, primitive class instance,
VOLVER AL INDICE
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 21.
Símbolo de OPERADOR
En orden de acceder a la simbología Haskell, nombraremos
algunos de los OPERADORES y como localizarlos en el teclado.
SÍMBOLOS:
tal que
negativo
paréntesis recto
paréntesis recto
denominador letra
potencia
| = Alt Gr + 1
¬ = Alt Gr + 6
[ = Alt Gr + [
] = Alt Gr + ]
a =
23 = 2^3
Un símbolo de operador es escrito utilizando uno o más de los
siguientes caracteres:
:!#$%&*+./?@^|-
El carácter (~) se permite, aunque sólo en la primera posición
del nombre. Los nombres de operador que comienzan con (:)
son utilizados para funciones constructoras como los
Identificadores que comienzan por mayúscula mencionados
anteriormente. Los siguientes símbolos tienen usos especiales:
:: = .. @ | ~ =>
Todos los otros símbolos de operador se pueden utilizar como
variables o nombre de función, incluyendo los siguientes:
+ ++ && || $ @@ -*- / / … ?
VOLVER AL INDICE
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 22.
Identificadores y Operadores:
Se proporcionan dos mecanismos simples para utilizar un
identificador como un símbolo de operador o un símbolo de
operador como un identificador:
Cualquier identificador será tratado como un símbolo de
operador si está encerrado entre comillas inversas (`):
"x `id` y" es equivalente a "id x y"
Cualquier símbolo de operador puede ser tratado como un
identificador encerrándolo en paréntesis.
"x + y" podría escribirse como "(+) x y
Cuando se trabaja en Standard Prelude con símbolos de
operador es necesario tener en cuenta la
PRECEDENCIA y la ASOCIATIVIDAD
VOLVER AL INDICE
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 23.
putStrLn "Hola Mundo"
Hola Mundo
Recordar que en Prelude la notación del se realiza en pseudo-Inglés
La sintaxis de los TIPOS y OPERADORES son también indispensables; excesos de paréntesis o
la disposición de los mismos puede acarrear incongruencias y errores para el Intérprete.
VOLVER AL INDICE
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 24.
PRECEDENCIA y ASOCIATIVIDAD
A. La precedencia La expresión "2 * 3 + 4" podría interpretarse como "(2 * 3) + 4" o como "2
* (3 + 4)". Para resolver la ambigüedad, cada operador tiene asignado un valor de
precedencia (un entero entre 0 y 9). En una situación como la anterior, se comparan los
valores de precedencia y se utiliza primero el operador con mayor precedencia (en el
standar prelude el (+) y el (*) tienen asignados 6 y 7, respectivamente, por lo cual se
realizaría primero la multiplicación).
B. La asociatividad: La regla anterior resolvía ambigüedades cuando los símbolos de
operador tienen distintos valores de precedencia, sin embargo, la expresión "1 – 2 – 3" puede
ser tratada como "(1 – 2) – 3" resultando -4 o como "1 – (2 – 3)" resultando 2. Para resolverlo,
a cada operador se le puede definir una regla de asociatividad. Por ejemplo, el símbolo (-) se
puede decir que es:
Asociativo a la izquierda: si la expresión "x-y-z" se toma como "(x-y)-z"
Asociativo a la derecha: si la expresión "x-y-z" se toma como "x-(y-z)"
No asociativo: Si la expresión "x-y-z" se rechaza como un error sintáctico.
VOLVER AL INDICE
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 25.
En el standar prelude el (-) se toma como asociativo a la izquierda, por lo que la expresión
"1 – 2 – 3" se tratará como "(1-2)-3".
Por defecto, todo símbolo de operador se toma como no-asociativo y con precedencia 9.
Estos valores pueden ser modificados mediante una declaración con los siguientes formatos:
infixl digito ops Para declarar operadores asociativos a la izquierda
infixr digito ops Para declarar operadores asociativos a la derecha
infix digito ops Para declarar operadores no asociativos
ops representa una lista de uno o más símbolos de operador separados por comas y digito
es un entero entre 0 y 9 que asigna una precedencia a cada uno de los operadores de la
lista. Si el dígito de precedencia se omite se toma 9 por defecto.
Existen ciertas restricciones en la utilización de estas declaraciones:
– Sólo pueden aparecer en ficheros de definición de función que sean cargados en el sistema
– Para un operador particular, sólo se permite una declaración
VOLVER AL INDICE
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 26.
En el standar prelude se utilizan las siguientes declaraciones:
infixl 9 !!
infixr 9 .
infixr 8 ^
infixl 7 *
infix 7 /, `div`, `rem`, `mod`
infixl 6 +, –
infix 5 \
infixr 5 ++, :
infixr 3 &&
infix 4 ==, /=,
infixr 2 ||
infix 4 `elem`, `notElem`
Tabla de precedencia/asociatividad de operadores: Expresión: Equivalente a: Motivos
1+2-3 (1 + 2) – 3 (+) y (-) tienen la misma precedencia y son asociativos a la izquierda.
x : ys ++ zs x : (ys ++ zs) (:) y (++) tienen la misma precedencia y son asociativos a la derecha.
x == y || z (x == y) || z (==) tiene más precedencia que (||)
3+4*5 3+(4*5) (*) tiene más precedencia que (+)
y `elem` z:zs y `elem` (z:zs) (:) tiene más precedencia que `elem`
12 / 6 / 3 error sintáctico (/) no es asociativo
f x + g y equivale a (f x) + (g y) las funciones tiene más precedencia que cualquier
símbolo de operador. Por ejemplo, la expresión f x + g y equivale a (f x) + (g y)
"f x + 1", equivale y es tratada como "(f x)+1" en lugar de "f(x+1)".
VOLVER AL INDICE
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 27.
MATERIAL REFERENCIAL
Varios Haskell Commision*
The Haskell 98 Report
Simon Peyton Jones
RICHARD BIRD
Introduction to Funcional.. Pentice Hall
CRISTIANO M. GASTÓN
JOSÉ R. MARCIAL ROMERO
ALFREDO PAZ VALDERRAMA
JOSÉ A. ALONZO JIMÉNEZ
PEPE GALLARDO
BLAS C. RUIZ y Otros
Haskell, Lenguajes ya
Programación Funcional
Introducción a la Progr.
Funciones de Ord. Súper.
Haskell
Razonando con Haskell
WordPress 2010®
UAEMex
UCSP.Pe
Universidad de Sevilla
Universidad de Málaga
Universidad de Málaga
SIMON THOMPSON
JOSÉ E. LABRA
JUAN P. VILLA IZASA
ANDRÉS y Otros
PACO GUTIERREZ y Otros
The craft of functional programming (extracto)
Introd. Al Lenguaje Haskell Universidad de Oviedo
Introd. Al Lenguaje Haskel
Definiciones de Tipos en Haskell
Una introducción agradable
Universidad de Málaga
PAQUI LUCIO
JULIO J. JAVIER
MAURO JASKELIOFF
VOLVER AL INDICE
Tipos y Clases
Haskell, introducción
Evaluación perezosa
SC.EHU
UTN. Fac. Córdoba
Faceia.UNR
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 28.
MATERIAL REFERENCIAL
Varios Haskell Commision*
The Haskell 98 Report
Simon Peyton Jones
Simon Peyton Jones [editor], Microsoft Research, Cambridge
Lennart Augustsson, Sandburst Corporation
Dave Barton, Intermetrics
Brian Boutel, Victoria University of Wellington
Warren Burton, Simon Fraser University
Joseph Fasel, Los Alamos National Laboratory
Kevin Hammond, University of St. Andrews
Ralf Hinze, University of Bonn
Paul Hudak, Yale University
John Hughes, Chalmers University of Technology
Thomas Johnsson, Chalmers University of Technology
Mark Jones, Oregon Graduate Institute
John Launchbury, Oregon Graduate Institute
Erik Meijer, Microsoft Corporation
John Peterson, Yale University
Alastair Reid, University of Utah
Colin Runciman, York University
Philip Wadler, Avaya Labs
VOLVER AL INDICE
ADOLFO MONTIEL VALENTINI ©
HASK
ELL & HUGS
I.N.E.T. 29.
HASKELL & HUGS
Propósito General:
El propósito de realizar ésta presentación, no es la exposición dogmática y docta
del tema Haskell & Hugs, sino todo lo contrario, acercar al estudiante que por primera vez
se ve enfrentado a un lenguaje de programación, sin tener formación previa y requiere de
una terminología específica acompañada de las definiciones lo más allegadas a su
entendimiento posible para acercarse a la abstracción del lenguaje computacional.
Todos los aportes posibles, serán recibidos y analizados para su posible incorporación en la
reedición de este material.
Correo de recepción de aportes: adolfomontielvalentini@hotmail.com
Análisis y compilación del material ante expuesto:
Adolfo Montiel Valentini ® 2011
Prof. Saúl Tenembaum Matematica Discreta I
Instituto Normal de Enseñanza Técnica (INET)
VOLVER AL INDICE
I.N.E.T