Upload
haxuyen
View
227
Download
0
Embed Size (px)
Citation preview
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