Semana 3

Notas de clase de la semana 3 de LPP.

Tema 2: Programación funcional

Veremos hoy

Funciones recursivas para construir listas

Vamos a ver cómo se implementan de forma recursiva:

Recordatorio: Diseño de funciones recursivas

¿Cómo diseñamos una definición recursiva de una función?

Función mi-list-ref

Función mi-list-tail

Función mi-append

Función mi-reverse

Función cuadrados-hasta

Función filtra-pares

Ejemplo final: Función primo?

Función recursiva (lista-hasta x)

Función (divisor? x y)

(define (divisor? x y)
      (= 0 (remainder y x)))

Función recursiva (filtra-divisores lista x)

Función (divisores x)


Funciones con número variable de argumentos


Funciones como tipos de datos de primera clase

Recordemos que un tipo de primera clase es aquel que:

  1. Puede ser asignado a una variable
  2. Puede ser pasado como argumento a una función
  3. Puede ser devuelto como resultado de una invocación a una función
  4. Puede ser parte de un tipo mayor

Con funciones:

  1. Una función se puede asignar a una variable
  2. Una función se puede pasar como parámetro de otras funciones
  3. Una función se puede devolver como resultado de una invocación a otra función
  4. Una función se puede guardar en tipos de datos compuestos como listas

Forma especial lambda

Sintaxis de la forma especial lambda

Semántica de la forma especial lambda

Podemos asignar el procedimiento a un identificador (símbolo)

(define f (lambda (x) (* x x)))

Podemos invocar a la función anónima directamente

((lambda (x) (* x x)) 3) ; ⇒ 9

Expresiones lambda en distintos lenguajes de programación

Java 8

Integer x -> {x*x}

Scala

(x:Int) => {x*x}

Objective C

^int (int x)
{
   x*x
};

Swift

{ (x: Int) -> Int in return x*x }

Identificadores y funciones

La forma especial define para definir una función no es más que azucar sintáctico

Predicado procedure?

Funciones argumentos de otras funciones

Función (aplica f x y)

Función aplica-2