Laboratorio de Lógica Computacional 2014-2 Práctica 1: Introducción a Haskell. Profesor: Francisco Hernández Quiroz Ayudante: Roberto Horacio Pérez López Ayudante de Laboratorio: Iván Idealdo Félix López Febrero 13 de 2014 • Descripción: Este documento contiene una ligera introducción a la programación funcional y, en particular, al lenguaje Haskell. • Objetivos: Que el alumno conozca algo de la motivación histórica de la programación funcional ası́ como que se habitúe con dicho lenguaje. Algunos hechos sobre la programación funcional • Básicamente, la programación funcional promueve un estilo más abstracto de programar basado en la idea de aplicar funciones a argumentos. • Con este alto nivel de abstracción es relativamente más sencillo razonar sobre los programas. • En la programación funcional pura no hay efectos laterales, las variables son inmutables. • Los lenguajes de programación en los que el método básico de computación radica en cambiar variables almacenadas se suelen llamar lenguajes imperativos. • Aunque algunos lenguajes de programación imperativos soportan cierta forma de programar con funciones, ellos no la fomentan. Por ejemplo, algunos lenguajes prohiben que las funciones se almacenen en estructuras de datos. Haskell hace lo contrario. • En los 30’s, Alonzo Church desarrolló el cálculo lambda, una teorı́a matemática de funciones. • En los 50’s, John McCarthy desarrolló Lisp, para algunos el primer lenguaje de programación funcional. El él aun habı́a asignación de variables. 1 • En los 60’s, Peter Landin desarrolló ISWIM If you See What I Mean, el primer lenguaje de programación funcional pura, basado fuertemente en el cálculo lambda y sin asignación de variables. • En los 70’s, John Backus desarrolló FP Functional Programming que enfatizaba a idea de funciones de nivel superior y razonar sobre los programas. • Asimismo en los 70’s, Robert Milner y su equipo desarrollaron ML Meta-Language, el primer lenguaje de programación funcional moderno donde se introdujo la idea de tipos polimórficos e inferencia de tipos. • En los 80’s, David Turner desarrolló cierto número de lenguajes de programación funcional perezosa, culminando con Miranda. • En 1987, un comité internacional de investigadores inició el desarrollo de Haskell, llamado ası́ por el lógico Haskell Curry. • En el 2003 el comité publicó el Reporte de Haskell, el que define la tan esperada versión estable de Haskell. Lo que todos debemos saber sobre Haskell • En Haskell toda función tiene un tipo que especifica la naturaleza de sus argumentos y resultados. • Los tipos permiten que muchos problemas se detecten antes de la ejecución. • Existe un sistema interactivo llamado Hugs para ejecutar programas en Haskell. Asimismo hay un compilador popular llamado Glasgow Haskell Compiler. • Al inicializar el sistema Hugs él primero carga una librerı́a llamada Prelude.hs. • En Haskell se emplean, demasiado, las listas. Dichas listas deben ser homogénea en el sentido que sus elementos son del mismo tipo. – Comando, Significado – :load nombre, lee el script nombre. – :reload, relee el script actual. – :edit, edita el script actual. – :type expr, muestra el tipo de expr. – :?, muestra todos los comandos. – :quit, cierra Hugs. • Palabras reservadas: – case, class, data, default, deriving, do, else – import, in, infix, infixl, infixr,instance 2 – module, newtype, of, then, type, where • Se usa -- para una lı́nea de comentarios y se usa {−código...−} para un bloque de comentarios. • Tipos básicos: – Bool, este tipo contiene los valores lógicos True y False. – String, cadenas de caracteres. – Int, enteros de precisión fija. – Integer, enteros de precisión arbitraria. – Float, números flotantes de precisión limitada. Práctica 1 Advertencia: Cada función debe tener explı́cita su firma. 1. Implemente una función aplica que toma una función f de Int en Int y una lista de Int, l ; tal que aplica f a los elementos de l de manera puntual. Ejemplo: Asumiendo que doble :: Int -> Int, dada por doble n = 2*n está definida, debe producir lo siguiente, aplica doble [1,2,3,4] = [2,4,6,8]. 2. Implementa una función sumalista que sume los elementos de una lista de Int. Ejemplo: sumalista [1,2,3,4] = 10. 3. Implementa una función palindromo verifica si una palabra de tipo String es o no una palı́ndromo. Ejemplo: palindromo casa = False, palindromo oso = True 4. Implementa una función sumapares que sume los elementos de una lista de (Int,Int). Ejemplo: sumapares [(1,2),(3,4)] = (4,6). 5. Implementa una función prodlista que multiplique los elementos de una lista de Int. Ejemplo: prodlista [1,2,3,4] = 24. 6. Implementa una función listaprimos que dado un entero nos proporcione una lista de enteros que contenga sus factores primos ordenados de menor a mayor. Ejemplo: listaprimos [6] = [1,2,3], listaprimos [7] = [1,7]. 7. Implementa una función esprimo que dado un entero decide si dicho número es o no un primo. Ejemplo: primo 6 = False, primo 7 = True. Pista: Usar listaprimos. ?Suerte ? . 3 Bibliografı́a Graham Hutton. Programming in Haskell. Cambridge University Press, 2007. Simon Thompson. Addison-Wesley. Haskell The Craft of Functional Programming, Second edition, 4