Programación funcional reactiva

Programación funcional y reactiva - Computación

Profesor: Ing. Santiago Quiñones

Docente Investigador

Departamento de Ingeniería Civil

Contenidos

Introducción a la programación funcional reactiva

Programación reactiva

Reactiva: que produce una reacción

Acciones sobre elementos de la GUI

Aproximaciones

Programación reactiva

Pero es posible reaccionar a otros elementos

  • Recibir un correo
  • Al valor de un sensor
  • A la creación de una carpeta
  • Cuando se crea un archivo
  • Cuando se modifica un valor
  • Cuando se inserta datos en una tabla
  • Etc.

 

Otras reacciones

Programación reactiva

Manejo de datos

  • Flujo infinitos de datos
  • Se reacciona cuando llega un grupo de datos
  • Reacciones de manera asíncrona
  • Patrón observer

 

Enfoques

Programación reactiva

Functional reactive programming

  • Comportamiento o señales
  • Comportamientos son valores continuos que siempre tienen un valor actual. Ej. la posición del mouse

 

Enfoques

Eventos vs Comportamientos

Diferencias

Functional Reactive Programming

Enfoques

¿Cómo hacer algo parecido usando PF?

Functional Reactive Programming

Definición

Una forma de expresar un programa como una reacción a sus entradas o como un flujo de datos.

Functional Reactive Programming

Scala.Rx

  • Maier, I., & Odersky, M. (2013, July). Higher-order reactive programming with incremental lists. In European Conference on Object-Oriented Programming (pp. 707-731). Springer, Berlin, Heidelberg.
  • Maier, I., & Odersky, M. (2012). Deprecating the observer pattern with Scala. react (No. REP_WORK).
  • Scala.RX: https://github.com/lihaoyi/scala.rx

Functional Reactive Programming

Ejemplo

En un proyecto basado en sbt

libraryDependencies += "com.lihaoyi" %% "scalarx" % "0.4.1"

Cosas útiles

  • Para ejecución desde la terminal de comandos
    1. Ir al directorio donde está el archivo build.sbt
    2. Ejecutar el comando sbt console
    3. Generar un contexto ímplicito​​

import rx._

                                                       implicit val ctx: Ctx.Owner = Ctx.Owner.safe()

 

 

Functional Reactive Programming

Ejemplo

En un proyecto basado en sbt

libraryDependencies += "com.lihaoyi" %% "scalarx" % "0.4.1"

Functional Reactive Programming

Ejemplo

  • Var: variable inteligente
  • Rx: definición reactiva (re-calcula cuando su dependencias cambian)
  • Obs: Var o Rx

Functional Reactive Programming

Ejemplo

import rx._

object Ejemplo2 extends App{
  val a = Var(1)
  val b = Var(2)
  val c = Rx{ a() + b()}
  val d = Rx{ c() * 5}
  val e = Rx{ c() + 4}
  val f = Rx{ d() + e() + 4}

  println(f.now)
  a() = 3

  println(f.now)
}

Functional Reactive Programming

Ejemplo

import rx._

object Ejemplo2 extends App{
  val a = Var(1)                  //  1
  val b = Var(2)                  //  2
  val c = Rx{ a() + b()}          //  3
  val d = Rx{ c() * 5}            // 15
  val e = Rx{ c() + 4}            //  7
  val f = Rx{ d() + e() + 4}      // 26

  println(f.now)                  // 26
}

Functional Reactive Programming

Ejemplo

import rx._

object Ejemplo2 extends App{
  val a = Var(1)                  
  val b = Var(2)                  //  2
  val c = Rx{ a() + b()}          //  5
  val d = Rx{ c() * 5}            // 25
  val e = Rx{ c() + 4}            //  9
  val f = Rx{ d() + e() + 4}      // 38

  println(f.now)                  
  a() = 3                         //  3
  println(f.now)                  // 38
}

Functional Reactive Programming

Observers - Obs

import rx._

object Ejemplo3_Observers extends App{
  val a = Var(1)
  var count = 0
  val o = a.trigger{
    count = a.now + 1
  }
  println(count)
  a() = 4
  println(count)
}

Obs pueden ser creados a partir de Rx o Var y pueden usarse para crear efectos colaterales cuando cambian. 

Functional Reactive Programming

Observers - Obs

import rx._

object Ejemplo3_Observers extends App{
  val a = Var(1)
  var count = 0
  val o = a.trigger{
    count = a.now + 1
  }
  println(count)
  a() = 4
  println(count)
}

¿Qué valores imprimen los programas?

import rx._

object Ejemplo3_Observers extends App{
  val a = Var(1)
  var count = 0
  val o = a.triggerLater{
    count = a.now + 1
  }
  println(count)
  a() = 4
  println(count)
}

Functional Reactive Programming

Kill Obs

import rx._

object Ejemplo5_KillObservers extends App{
  val a = Var(1)
  val b = Rx{ 2 * a()}
  var target = 0
  val o = b.trigger{
    target = b.now
  }
  println(target)
  a() = 2
  println(target)
  o.kill()
  a() = 3
  println(target)
}

Es posible "apagar un Obs" usando el método kill.

Functional Reactive Programming

Determinar la salida

Determine la salida del siguiente programa

Trabajo de consulta

Trabajo de consulta

Detalles

  • Repositorio en GitHub 
  • Consulta sobre EDA (Exploratory Data Analysis) y estadística descriptiva

 

Proyecto Integrador o Bimestral

Proyecto Integrador o bimestral

Entrega 1

  • Repositorio en GitHub (incluir todos los integrantes + docentes)
  • Tablas de datos (nombre de columna, tipo, propósito y observaciones) - Readme.md 
  • Análisis de datos en columnas numéricas (estadísticas básicas)
  • Análisis de datos en columnas tipo texto (algunas col. - distribución de frecuencia). OJO: no considerar columnas en formato JSON
  • Consultar sobre librería play-json (trabajo json en scala) y hacer:
    • Usar cualquier JSON pequeño para aprender play-json
    • Usar en algunas columnas JSON para obtener datos. 

 

Proyecto Integrador o bimestral

Comentarios entrega Nro. 1

  • Es necesario realizar limpieza de datos:
    • Cadenas vacías
  • Algunas columnas necesitan análisis cuidadoso, ejemplo:
    • Separador no definido: genres, cast (nombres)
    • Dato estructurado: release_date (fecha)