Práctica 1. Programación Funcional -...

26
Práctica 1. Programación Funcional Introducción a Helium Who? Lenguajes y Paradigmas de Programación

Transcript of Práctica 1. Programación Funcional -...

Práctica 1. Programación FuncionalIntroducción a Helium

Who? Lenguajes y Paradigmas de Programación

Objetivo de la práctica

Presentar las facilidades básicas del entorno deprogramación HeliumPresentar los conceptos básicos en cuanto a sintaxisde HaskellFamiliarizarse con la recursión en la programaciónfuncional

Helium

Principales diferencias de Helium con el estándarHaskell98

regla de sangradosistema de módulossintaxis de partes izquierdasno se soportan clasesno se permite sobrecarga de operadoresmenos librerías

Helium

entorno gráfico Hinteditor de textos ConTEXTse pueden lanzar órdenes

desde los menúsuso de comandos estándar de Haskell

HeliumComandos básicos

LIST OF COMMANDS: Any command may be

abbreviated to :c where c is the first

character in the full name.

:load <modulename> - loads the specified module

:reload - reloads the current module

:type <expression> - print type of the expression

:info <function> - view function in on-line documentation

:edit [<row:col>] - edit the currenty loaded module

:jump - jump editor to last error location

:quit - exit the interpreter

:help - shows available commands

:clear - clears the screen

Programación funcionalEdición y carga de programas

Un programa Haskell es un conjunto de módulos.Cada módulo se especifica en un fichero y contendráuna serie de funciones.

El nombre del módulo debe empezar por mayúsculaEl nombre del módulo debe coincidir con el nombredel fichero donde se almacenaLos módulos empiezan con las palabras clave:

module NombreModulo where

y a continuación las definiciones de tipos y código delas funciones del módulo

Programación funcionalIndentación

Las declaraciones de más alto nivel (definiciones defunciones) se indentan en la primera columna.El inicio de la siguiente definición de función en laprimera columna establece el fin de la declaraciónanterior.Para continuar una expresión en la siguiente fila, seindentará a un nivel más.

Programación funcionalComentarios y más

Comentarioscomentario de una línea: - - al principio de la líneacomentario de un bloque de varias líneas: {- alprincipio del bloque y -} al final

Escapeel caracter de escape en Haskell es el \

Programación funcionalComentarios y más

Comentarioscomentario de una línea: - - al principio de la líneacomentario de un bloque de varias líneas: {- alprincipio del bloque y -} al final

Escapeel caracter de escape en Haskell es el \

Programación funcional

Cada componente de un programa es una funciónLas funciones devuelven siempre un único resultado

si queremos devolver varias cosas, tendremos que usartuplas ( , )

Existen funciones predefinidasHaskell es un lenguaje funcional lazy

Definición defunciónes

1 Definiremos su tipo2 Definiremos su comportamiento

Programación funcional

Cada componente de un programa es una funciónLas funciones devuelven siempre un único resultado

si queremos devolver varias cosas, tendremos que usartuplas ( , )

Existen funciones predefinidasHaskell es un lenguaje funcional lazy

Definición defunciónes

1 Definiremos su tipo2 Definiremos su comportamiento

Programación funcionalDefinición de funciones

Ejemplo

increment :: Int -> Intincrement x = x + 1

Ejemplo roots :: Float -> Float -> Float ->(Float, Float)

Programación funcionalDefinición de funciones

Ejemplo

increment :: Int -> Intincrement x = x + 1

Ejemplo roots :: Float -> Float -> Float ->(Float, Float)

Programación funcionalTipos y operadores definidos

Bool True, FalseInt -100, 1, 2, . . .Integer -3333333333, 3, 484398473, . . .Float/Double -3.22425, 0.0, 3.0, . . .Char ’a’, ’z’, ’;’, . . .String “Hola”, “Funcion”, . . .

== /= < <= > >=

Ejercicio

Escribir en el editor de textos el siguiente programa:module Hello wherehello n = concat (replicate n ’hello ’)

cargar el programa en el intérpretecorregir el error que apareceintroducir la declaración de tipos

Programación funcionalInformación sobre tipos

module Errortipos where

main = f 0 ’a’

f :: Char -> Int -> Stringf c i = [c] ++ showInt i

Cargar el programa anterior y observar la respuestadel sistema

Programación funcionalInformación sobre tipos

Compiling Errortipos.hs(3,10): Type error in applicationexpression : f 0 ’a’term : f

type : Char -> Int -> Stringdoes not match: Int -> Char -> a

probable fix : re-order arguments

Programación funcionalExpresión condicional

El tipo de datos Bool define los valores True yFalse

if-then-else

if cond then result1else result2

Se pueden usar operadores booleanos como &&, ||,o not

Programación funcionalGuardas (ecuación condicional)

Las guardas nos permiten programar usando unaestrategia similar al pattern matching. Tendremosuna única definición de función pero mediante lasguardas podemos distinguir los distintos casosposibles.

Esquema deguardas

nombreFunc argts | cond = result1| cond = result2...| otherwise = resultn

Ejemplo (1/2)

module Power1 where

power1 :: Int -> Int -> Intpower1 _ 0 = 1power1 n t = n * power1 n (t-1)

Ejemplo (2/2)

module Power2 where

power2 :: Int -> Int -> Intpower2 _ 0 = 1power2 n t

| even t = power2 (n*n) (div t 2)| otherwise = n * power2 (n*n) (div t 2)

Programación funcionalDe función a operador y viceverse

Normalmente los operadores se invocan de formainfija y las funciones de forma prefija.

funcionesinfijas Para poder invocar una función de forma infija

debemos ’encerrarla’ entre backquotes (acentosgraves)

5 ` max ` 3

operadoresprefijos Para poder invocar un operador de forma prefija

debemos ’encerrarlo’ entre paréntesis

(+) 5 3

Programación funcionalDe función a operador y viceverse

Normalmente los operadores se invocan de formainfija y las funciones de forma prefija.

funcionesinfijas Para poder invocar una función de forma infija

debemos ’encerrarla’ entre backquotes (acentosgraves)

5 ` max ` 3

operadoresprefijos Para poder invocar un operador de forma prefija

debemos ’encerrarlo’ entre paréntesis

(+) 5 3

Programación funcionalDe función a operador y viceverse

Normalmente los operadores se invocan de formainfija y las funciones de forma prefija.

funcionesinfijas Para poder invocar una función de forma infija

debemos ’encerrarla’ entre backquotes (acentosgraves)

5 ` max ` 3

operadoresprefijos Para poder invocar un operador de forma prefija

debemos ’encerrarlo’ entre paréntesis

(+) 5 3

Programación funcionalRecursión

Normalmente nos encontraremos con dos esquemasde recursión básicos:

cuando hagamos recursión sobre enterosel caso base será normalmente el valor 0 (ó 1)el caso de inducción será el sucesor al valor actual

Ejercicios

Leed el boletín de la práctica 1.Realizad los ejercicios que se proponen al final delmismo.