Ed Tema 1 El Estilo Funcional

download Ed Tema 1 El Estilo Funcional

of 62

Transcript of Ed Tema 1 El Estilo Funcional

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    1/62

    Estructuras de Datos.

    Grados en Ingeniera Informtica, del Software y de Computadores

    ETSI Informtica

    Universidad de Mlaga

    Jos E. Gallardo, Francisco Gutirrez, Pablo Lpez

    Dpto. Lenguajes y Ciencias de la Computacin

    Universidad de Mlaga

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    2/62

    Programacin Funcional

    Programacin Imperativa vs Programacin Funcional Funciones puras e impuras

    Ventajas de la Programacin Funcional

    Introduccin a Haskell Identificadores

    Tipos bsicos

    Definiciones de funciones. Aplicaciones Operadores, precedencia y asociatividad

    Evaluacin de expresiones

    Tuplas

    Polimorfismo y sobrecarga

    Ecuaciones condicionales y expresiones

    Funciones definidas parcialmente Definiciones locales

    Operadores vs Funciones

    Introduccin a QuickCheck

    2

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    3/62

    Los cmputos manipulan variables mutables

    Estas variables mutables representan la memoria o el

    estado del computador

    Los algoritmos modifican las variables hasta obtener el

    resultado deseado

    3

    Las variables i y p son

    alteradas durante la

    ejecucin

    http://en.wikipedia.org/wiki/Imperative_programming

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    4/62

    Un estilo de programacin basado en cmputos a travsde funciones matemticas (o puras) :http://en.wikipedia.org/wiki/Functional_programming

    Un programa es una funcin

    Toma datos a travs de sus argumentos

    Realiza clculos con estos datos a travs de expresiones

    Devuelve nuevos datos (resultados del cmputo)

    Nada cambia !

    No existe el concepto de variable mutable tpico de la programacin

    imperativa4

    funcin

    (programa)

    datos

    argumentos

    nuevos datos

    resultado

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    5/62

    Funcin para calcular factorial en Haskell:

    Evaluacin paso a paso:

    5

    No hay variables

    mutables. Tan solofunciones y expresiones

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    6/62

    Una funcin matemtica siempre devuelve el mismoresultado para los mismos valores de susargumentos:

    x= y f (x) = f (y) (Regla de Leibniz)

    Esto conduce a la propiedad de transparenciareferencial:

    Una misma expresin denota siempre el mismo valor, seacual sea el punto del programa o el contexto en queaparezca.

    Simplifica el razonamiento sobre las propiedades de

    los programas (en particular, la correccin) Podemos calcular con programas al igual que en

    matemticas calculamos con expresiones

    6

    http://en.wikipedia.org/wiki/Pure_function

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    7/62

    Un ejemplo de funcin pura:

    siempre devuelve

    Si = entonces =

    7

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    8/62

    La siguiente no es una funcin pura:

    La primera llamada devuelve

    La segunda llamada devuelve Para el mismo valor del argumento

    devuelve diferentes resultados8

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    9/62

    La siguiente tampoco es una funcin pura (no esmatemtica):

    Cada llamada puede devolver un valor distinto

    9

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    10/62

    La programacin funcional consiste en escribirprogramas (funciones) combinando otrasfunciones

    En los lenguajes funcionales puros:

    Solamente podemos definir funciones puras

    Se satisface la transparencia referencial

    Miranda, Clean, Haskell,

    En los lenguajes funcionales impuros: Se permite definir funciones impuras

    ML, F#, Scheme, 10

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    11/62

    Optimizacin: el compilador puede realizar

    transformaciones sofisticadas con objeto de optimizar elcomportamiento

    Paralelismo: partes de una expresin pueden evaluarse encualquier orden sin alterar el resultado; incluso varios

    procesadores pueden intervenir en la evaluacin de lamisma expresin. La Programacin Funcional Pura es intrnsecamente paralela

    La Programacin Imperativa es intrnsecamente secuencial

    Memoization: los resultados producidos por las llamadas a

    una funcin pueden ser reutilizados (recordados) ensucesivas llamadas con los mismos valores de losargumentos

    11

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    12/62

    En un LFP (lenguaje funcional puro), la definicin:

    puede reemplazarse por :

    sin modificar el significado del programa.

    Esta sencilla transformacin es una optimizacin:solamente se computa (evala) una vez

    Adems, la expresinpuede evaluarse va paralelismo

    Lo anterior no es vlido en lenguajes impuros

    12

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    13/62

    Un Lenguaje Funcional Puro estndar

    Principales caractersticas:

    Pureza funcional

    Tipificacin esttica

    Perezoso (Lazy)

    13

    www.haskell.org

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    14/62

    Haskell distingue maysculas de minsculas (case sensitive) !

    Los identificadores (nombres) de funciones y argumentos: Deben empezar con una letra minscula o el carcter _ (underscore) y ste

    puede ir seguido de letras (maysculas o minsculas), dgitos, tildes (') o _

    Ejemplos vlidos de identificadores:

    Ejemplos no vlidos:

    Los nombres de tipos deben empezar con una letra mayscula

    , , , , , etc. Los nombres de operadores:

    Pueden contener uno o varios smbolos

    El primero no puede ser dos-puntos (:) Ejemplos vlidos:

    14

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    15/62

    un subconjunto acotado de los nmeros enteros operaciones rpidas; posibilidad de overflowo

    underflow

    15

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    16/62

    el conjunto completo de los enteros

    subconjunto de los reales en simple precisin

    subconjunto de los reales en doble precisin

    16

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    17/62

    tiene solamente dos valores: y

    conjuncin lgica (and):

    disyuncin lgica (or):

    negacin lgica:

    x y not primo yHay evaluacin en cortocircuito

    17

    http://en.wikipedia.org/wiki/George_Boole

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    18/62

    conjunto de caracteres Unicode :, , , , , , , ,

    , , , , , ,

    Muchas funciones sobre caracteres aparecendefinidas en el mdulo o librera :

    18

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    19/62

    Haskell usa notacin parcializada (curried)

    Introducida porMoses Schnfinkel (1889-1942)

    y popularizada por

    Haskell Curry (1900-1982)

    Para definir una aplicacin:

    Escribimos el identificador de la funcin y acontinuacin los argumentos separados por espacios

    El uso de parntesis slo ser necesario para agrupartrminos compuestos y modificar el efecto de lasprioridades de las operaciones

    19

    http://en.wikipedia.org/wiki/Currying

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    20/62

    20

    nombre de

    la funcin argumentoresultado

    toma un

    entero

    devuelve un

    entero

    toma dos enteros

    y devuelve un

    entero

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    21/62

    21

    square solo se aplica

    una vez al 5

    square se aplica a la suma5 + 1.

    Los parntesis son

    necesarios

    phytagoras se aplica

    a los dos argumentos

    El segundo argumento escompuesto y necesita

    parntesis

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    22/62

    22

    Una expresin condicional, como cualquier otraexpresin, puede formar parte del cuerpo de una

    funcin:

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    23/62

    23

    El cuerpo de una funcin puede contener a la funcin que define

    El uso del tipo (subconjunto finito) causar problemas:

    El problema se resuelve tomando Integer (una abstraccin del

    conjunto completo de los enteros)

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    24/62

    GHC es el Glasgow Haskell Compiler, un compiladorde alta calidad para Haskell

    GHCi es el Glasgow Haskell Compiler Interpreter:

    Con el uso del bucle Read-Eval-Printpodemos ejecutar

    programas Haskell

    GHC y GHCi estn disponibles para las plataformas

    ms populares: Windows, Linux y OSX

    En la pgina web de la asignatura aparecen

    instrucciones de instalacin24

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    25/62

    Dos entornos para GHCi

    25

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    26/62

    El operador unario es el nico operador unariosimblico prefijo:

    El resto de operadores simblicos son binarios y seusan directamente en forma infija:

    Precedence parsing error

    26

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    27/62

    Nivel Operador predefinido

    Mxima precedencia 10 Aplicacin de una funcin

    9

    8

    7

    6

    5

    4

    3

    2

    1

    Mnima precedencia 0

    27

    La aplicacin de una

    funcin tiene prioridad

    mxima

    La multiplicacin tiene

    mayor nivel de

    precedencia que la suma

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    28/62

    Esta propiedad permite resolver la ambigedaden ausencia de parntesis:

    Si asocia a la izquierda:

    Si asocia a la derecha:

    Si no es asociativo:

    28

    ERROR: los parntesis

    son necesarios

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    29/62

    Ejemplos:

    Asociatividad OperadorDerecha

    Izquierda

    No asociativo

    29

    Expresin errnea

    Use parntesis si

    desconoce la

    asociatividad

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    30/62

    Son diferentes conceptos que no deben ser

    confundidos

    La asociatividad es un atributo sintctico de unoperador en un lenguaje de programacin

    El operador verifica la propiedad asociativa ensentido matemtico si satisface:

    x, y, z . (x y) z = x (y z)

    La propiedad asociativa tambin es interesante

    computacionalmente: Para evaluar x y z se parentizar de acuerdo con el

    menor coste computacional.

    30

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    31/62

    Nivel de precedencia

    infix = no asociativo.infixl = asociativo a izda

    infixr = asociativo a dcha

    El identificador del

    operador debe

    aparecer entre

    parntesis en unadeclaracin de tipo

    31

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    32/62

    Toda funcin de dos argumentos cuyo identificador sea literal

    puede ser utilizada en forma infija encerrndolo entre acentos

    graves (`)notacin prefija

    Error

    32

    Si la funcin es asociativa

    no son necesarios los

    parntesis

    forma infija

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    33/62

    Recprocamente, cualquier operador simblico puede utilizarse en

    forma prefija encerrndolo entre parntesis

    33

    forma prefija

    forma infija

    Error

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    34/62

    34

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    35/62

    Redex (reducible expression): parte de una expresin que puede

    ser simplificada

    Reduccin: proceso de reescritura de un redex. Cada reduccin es

    un paso de cmputo

    Forma Normal : expresin sin redexes

    35

    redex

    reduccin

    es una formanormal

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    36/62

    36

    Orden Aplicativo

    Se reduce el redex ms interno y ms

    a la izquierda.

    Los argumentos son evaluados antes

    que la funcin

    Pros

    Los argumentos compuestos seevalan una sola vez

    Contras

    Pueden realizarse reducciones

    innecesarias.

    Puede no conducir a la forma normal

    (no es normalizante)

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    37/62

    37

    Orden Aplicativo

    Se reduce el redex ms interno y ms

    a la izquierda.

    Los argumentos son evaluados antes

    que la funcin

    Pros

    Los argumentos compuestos seevaluan una sola vez

    Contras

    Pueden realizarse reducciones

    innecesarias.

    Puede no conducir a la forma normal

    (no es normalizante)

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    38/62

    38

    Orden Normal

    Se reduce el redex ms externo y

    ms a la izquierda.

    La funcin es aplicada antes de

    evaluar sus argumentos

    Pros

    Slo se evalan las expresiones

    necesarias.

    Siempre conduce a la forma normal si

    sta existe (normalizante)

    Contras

    Puede repetirse la evaluacin de un

    argumento compuesto

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    39/62

    39

    Orden Normal

    Se reduce el redex ms externo y

    ms a la izquierda.

    La funcin es aplicada antes de

    evaluar sus argumentos

    Pros

    Slo se evalan las expresiones

    necesarias.

    Siempre conduce a la forma normal si

    sta existe (normalizante)

    Contras

    Puede repetirse la evaluacin de un

    argumento compuesto

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    40/62

    Haskell usa evaluacin perezosa (lazy) :

    Combina las ventajas del orden normal y del aplicativo

    Es similar al orden normal pero evita la reevaluacin:

    Los argumentos son evaluados una sola vez y su valor comn

    es compartido (sharing)

    Esta optimizacin es posible en lenguajes puros

    40

    valorcompartidovalorcompartido

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    41/62

    Son estructuras de datos heterogneas:

    Es una coleccin de valores (componentes)

    Cada componente puede tener un tipo distinto

    Sintaxis: Los valores se separan por comas y se colocan entre

    parntesis

    Los tipos de cada componente se separan por comas y

    se colocan entre parntesis

    41

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    42/62

    42

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    43/62

    Funciones predefinidas que extraen las componentes de una tupla:

    Patrn de una2-tupla

    y son variables de tipo; toma

    una 2-tupla con componentes de tipos

    arbitrarios y . Se dice que es

    polimrfica.

    Prelude

    Prelude

    Indica una

    funcin

    predefinida

    Debe leerse como: , .

    43

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    44/62

    Unaclase de tipos es un conjunto de tipos que comparten alguna operacin

    es la clase predefinida para los tipos numricos (enteros, flotantes,

    racionales, ...)

    Algunos operadores y funciones solamente tienen significado para tipos

    numricos:

    Prelude

    tipo sobrecargado

    debe ser una

    instancia de ; es

    decir, debe ser un

    tipo numrico

    Los operandos y el resultado

    tienen que ser del mismo tipo

    debe leerse como:

    .

    44

    http://en.wikipedia.org/wiki/Type_class

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    45/62

    suma sobreInteger

    producto sobre

    Floating

    2 est sobrecargado

    Char no es de la clase Num

    Type error

    45

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    46/62

    es la clase que agrupa los tipos de nmeros enteros

    Tiene funciones especficas para la divisin entera:

    Prelude

    Tipo sobrecargadoipo sobrecargado

    debe ser de la clase

    Integral

    debe leerse como:

    .

    cociente y resto de la

    divisin entera

    Los nmeros Floating no

    son Integral.

    Type error

    46

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    47/62

    es la clase que agrupa los tipos de nmeros fraccionarios:

    flotantes y racionales (cocientes de enteros , ...) La funcin esencial es la divisin fraccionaria:

    Prelude

    El tipo debe ser

    de la clase

    Fractional

    Esto debe leerse como: .

    Divisin

    fraccionaria

    10 y 3 estnsobrecargados

    47

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    48/62

    Esta funcin usa el operador

    sobrecargado

    Solo puede ser aplicada a tipos

    numricos; la funcin hereda el

    contexto

    48

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    49/62

    es la clase de los tipos para los cuales existe una relacin de orden total;

    entre stos aparecen Integer, Double, Char, Rational, Bool, Ciertos operadores (

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    50/62

    es la clase de los tipos para los cuales existe una relacin de igualdad; entre

    stos aparecen Integer, Double, Char, Rational, Bool, La clase incluye dos operadores:

    Prelude

    debe ser un tipo

    instancia deSolo podemos comparar

    valores del mismo tipo, y

    el resultado siempre ser

    un booleano

    Debe leerse como: .

    50

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    51/62

    51

    1 es menor que 2

    1 no es igual a 2

    1 es distinto de 2

    1 esLess Than2

    10 es reater Than2

    1 es Qual a 1

    El mayor de 3.5 y 7.8 es 7.8

    El menor de 3.5 y 2.0 es 2.0

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    52/62

    52

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    53/62

    A menudo es ms sencillo describir una

    funcinpor partes:

    Su valor es 1, si el

    argumento es positivo

    Guardas booleanas

    Su valor es -1, si el

    argumento es negativo

    Su valor es 0, si el

    argumento es nulo

    53

    http://en.wikipedia.org/wiki/Guard_(computing)

    Atencin al

    sangrado . Los

    separadores

    en la misma

    columna

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    54/62

    La definicin anterior:

    puede escribirse de forma ms corta (estilo preferente):

    otherwise therwise: esta condicin

    siempre es cierta. Ser

    seleccionada si fallan las

    previas

    54

    Prelude

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    55/62

    Las expresiones condicionales proporcionan una

    alternativa a las formas guardadas:

    Prelude

    55

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    56/62

    Hay funciones definidas solo parcialmente:

    Esto se consigue va la funcin error:

    Error es una funcin polimrfica:

    error :: -> a

    56

    el valor de tipo String

    describe la

    excepcin

    Prelude

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    57/62

    La palabra reservada permite definir funciones o variables

    locales, y debe aparecer al final de la definicin

    where: debe

    sangrarse con

    respecto a la funcin

    Las definiciones locales deben

    sangrarse al mismo nivel

    57

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    58/62

    Una alternativa para introducir definiciones locales es va la

    construccin

    resultado de la

    expresin

    definiciones localesLas definiciones locales

    deben estar sangrarseal mismo nivel

    58

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    59/62

    Es una buena prctica probar los

    programas

    Las pruebas ayudan a encontrar

    errores

    QuickCheck es una librera de Haskell que ayuda a

    probar los programas

    Definimos propiedades que nuestros programas deben

    cumplir QuickCheck genera casos de prueba y verifica las

    propiedades para esos casos59

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    60/62

    Propiedades en QuickCheck:

    antecedente consecuente

    antecedente y consecuente deben ser expresionesbooleanas

    Debe leerse como una implicacin lgica: si el antecedentees cierto entonces el consecuente tambin debe serlo

    QuickCheck solo realiza las verificaciones para propiedadesen las que el antecedente es cierto. Las pruebas conantecedente falso son descartadas

    Se debe usar si la propiedad es el propio consecuente

    consecuente60

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    61/62

    Algunas propiedades:

    61

    Fallo en la prueba

    contraejemplo

    Hacemos que

    QuickCheck pruebenuestra propiedad

    con enteros

    aleatorios

    2. . 2

    . . | | || ||

    0. 0 . | | || ||

  • 7/23/2019 Ed Tema 1 El Estilo Funcional

    62/62

    Edsger W. Dijkstra (1930-2002, Premio Turing 1972)

    Para establecer la correccin de un algoritmo se debe realizar una

    demostracin

    Algunas veces es difcil y lleva mucho tiempo

    Realizar pruebas es mejor que no hacer nada

    62

    Las pruebas de un programa

    pueden usarse para mostrar la

    existencia de errores, pero nunca

    para demostrar su ausencia!

    http://en.wikipedia.org/wiki/Edsger_W._Dijkstra