SlideShare ist ein Scribd-Unternehmen logo
1 von 76
Programación funcional
    con Javascript
             Leo Soto M.

    Lecture & Beer 2010, Continuum.
¿Programación funcional?
Scheme? ML? F#? Haskell?
Dos principios
Principio 1:

Olvida las variables. Existen valores y ya.
Principio 1:

Olvida las variables. Existen valores y ya.

¡Como en matemáticas!
variables == bugs
x = x + 1
x = x + 1 // -x
x = x + 1 // -x

x - x = x - x + 1
x = x + 1 // -x

x - x = x - x + 1

0    = 1
x = x + 1 // -x

x - x = x - x + 1

0     = 1
WTF
¡Pero esta charla no trata sobre ese principio!
> var foo = “estamos jodidos”
Principio 1I:

Las funciones son valores
Principio 1I:

Las funciones son valores primitivos
> var miVariable = 1
> var miVariable = 1
> var otraVariable = miVariable
> var miVariable = 1
> var otraVariable = miVariable
> typeof(miVariable)
number
> function miFuncion() { return 1 }
> typeof(miFuncion)
function
> function miFuncion() { return 1 }
> typeof(miFuncion)
function

> var otraFuncion = miFuncion;
> typeof(otraFuncion)
function
> function miFuncion() { return 1 }
> typeof(miFuncion)
function

> var otraFuncion = miFuncion;
> typeof(otraFuncion)
function

> typeof(otraFuncion())
number
Sintaxis equivalente:
> function f(x, y) { ... }
> var f = function(x, y) { ... }
Higher order functions:

Funciones que reciben funciones
function time(f) {
  start = new Date().getTime();
  f()
  end = new Date().getTime();
  print(“Milliseconds: ” +
        (start - end));
}
time(function() {
   var x = 1;
   for (var i = 2; i < 1000; i++) {
       x = x * i;
   }
})
Higher order functions:

Funciones que retornan funciones
$(“#edad”).blur(
   function() {
     validarRango(this, 18, 65);
   }
);
$(“#edad”).blur(
   validadorRango(18, 65)
);
function validadorRango(a, b) {
  return function() {
    var v = $(this).val();
    if (v < a || v > b) {
      alert(“Fuera de rango”);
    }
  }
}
¡Closures!
function validadorRango(a, b) {
  return function() {
    var v = $(this).val();
    if (v < a || v > b) {
      alert(“Fuera de rango”);
    }
  }
}
function validadorRango(a, b) {
  return function() {
    var v = $(this).val();
    if (v < a || v > b) {
      alert(“Fuera de rango”);
    }
  }
}

    ¡No se ejecuta inmediatamente!
function validadorRango(a, b) {
  return function() {
    var v = $(this).val();
    if (v < a || v > b) {
      alert(“Fuera de rango”);
    }
  }
}

     ¡No se ejecuta inmediatamente!
 ¡Pero puede acceder a valores de “afuera”!
Es como escribir macros, o plantillas
function validadorRango(a, b) {
  return function() {
    var v = $(this).val();
    if (v < a || v > b) {
      alert(“Fuera de rango”);
    }
  }
}
Primitivas funcionales:

  map, filter, reduce,
       any, all,
        partial
map
> function double(x) { return 2 * x }
> map([1, 2, 3], double)
[2, 4, 6]
function map(array, f) {
  var r = [];
  for (var i in array) {
    r.push(f(array[i]);
  }
  return r;
}
reduce
> function sum(x, y) { return x + y }
> function mul(x, y) { return x * y }
> reduce([1, 2, 3, 4], 0, sum)
10
> reduce([1, 2, 3, 4], 1, mul)
24
function reduce(array, inicial, f) {
  var r = inicial
  for (var i in array) {
    r = f(r, array[i]);
  }
  return r;
}
filter
> function par(x) {return x % 2 == 0}
> filter([1,2,3,4,5], par)
[2, 4]
function filter(array, f) {
  var r = [];
  for (var i in array) {
    if (f(array[i])) {
      r.push(array[i]);
    }
  }
  return r;
}
any
> function par(x) {return x % 2 == 0}
> any([1,2,3,4,5], par)
true
> any([1,3,5], par)
false
function any(array, f) {
  for (var i in array) {
    if (f(array[i])) {
      return true;
    }
  }
  return false;
}
all
> function par(x) {return x % 2 == 0}
> all([1,2,3,4,5], par)
false
> all([2,4,6], par)
true
function all(array, f) {
  for (var i in array) {
    if (!f(array[i])) {
      return false;
    }
  }
  return true;
}
function all(array, f) {
  return !any(array, function(x) {
    return !f(x)
  }
}
partial
> function mul(x, y) { return x * y }
> var double = partial(mul, 2)
> double(10)
20
function partial(f) {
  var fixedArgs = arguments.splice(
     1, arguments.length - 1);
  return function() {
     return f.apply(
        this,
        fixedArgs.concat(arguments)
     );
  };
}
Ejemplos
supers = filter(users, function(u) {
  return u.superuser;
}
names = map(supers, function(u) {
  return u.fullName;
});
function getprop(x) {
  return function(o) {
    return o[x];
  }
}
supers = filter(users,
                getprop(“superuser”))
names = map(supers,
            getprop(“fullName”))
filter(leagues, function(league) {
  return any(league.users,
             getprop(“unapproved”));
});
reduce(
  map(users, getprop(“age”)),
  -1,
  Math.max
)
Familiar feeling?



map(usuarios, f)        =~ SELECT f(usuario)
filter(usuarios, f)      =~ WHERE f(usuario)
any(usuarios, f)        =~ SOME(f(usuario))
all(usuarios, f)        =~ ALL(f(usuario))
reduce(usuarios, ...)   =~ MAX/MIN/AVG...
var phones = []
for (var i in users) {
  var user = users[i];
  var userPhones = [];
  if (user.phones[0]) {
    userPhones.push(user.phones[0]);
  }
  if (user.phones[1]) {
    userPhones.push(user.phones[1]);
  }
  phones.push(userPhones);
}
function first(n, array) {
  var r = [];
  for (var i = 0;
       i < Math.min(array.length, n);
       i++) {
    r.push(array[i]);
  }
  return r;
}
var phones = []
for (var i in users) {
  phones.push(
     first(2, users.phones)
  );
}
function compose(f, g) {
  return function(x) {
    return f(g(x));
  }
}
map(users,
    compose(partial(first, 2),
            getprop(“phones”)))
map(users, function(u) {
    return first(2, u.phones);
});
Implementaciones
Javascript 1.6 (Mozilla)


                                    array.map,
                                  array.filter
                                 array.reduce*
                                    array.some
                                   array.every




*Introducido en Javascript 1.8
JQuery




      $.map,
  $(“.foo”).map
$(“.foo”).filter
Underscore
 http://documentcloud.github.com/underscore/

_.map, _.reduce, _.detect, _.all, _.any,
              _.sortBy, ...

 _.first, _.rest, _.compact, _.flatten,
     _.uniq, _.zip, _.intersect, ...

     _.invoke, _.pluck, _.tap, ...

          _.keys, _.values, ...

       _.compose, _.bind, _.memoize
¡Eso!
¿Preguntas?

Weitere ähnliche Inhalte

Was ist angesagt? (18)

Tipos basicos de java
Tipos basicos de javaTipos basicos de java
Tipos basicos de java
 
Programas en netbeans
Programas en netbeansProgramas en netbeans
Programas en netbeans
 
Arreglos en C++
Arreglos en C++Arreglos en C++
Arreglos en C++
 
Sudoku
SudokuSudoku
Sudoku
 
Lenguajec++
Lenguajec++Lenguajec++
Lenguajec++
 
Tema3 p2%20
Tema3 p2%20Tema3 p2%20
Tema3 p2%20
 
Descubriendo scala
Descubriendo scalaDescubriendo scala
Descubriendo scala
 
Parte 15
Parte 15Parte 15
Parte 15
 
Java AWT Tres en Raya
Java AWT Tres en RayaJava AWT Tres en Raya
Java AWT Tres en Raya
 
Resumen java
Resumen javaResumen java
Resumen java
 
Tipos de operadores_velazquez
Tipos de operadores_velazquezTipos de operadores_velazquez
Tipos de operadores_velazquez
 
Que es una funcion
Que es una funcionQue es una funcion
Que es una funcion
 
Tipos de operadores
Tipos de operadoresTipos de operadores
Tipos de operadores
 
Tipos de operadores_dulce_velazquez
Tipos de operadores_dulce_velazquezTipos de operadores_dulce_velazquez
Tipos de operadores_dulce_velazquez
 
Ejercicios java
Ejercicios javaEjercicios java
Ejercicios java
 
Kruskal
KruskalKruskal
Kruskal
 
Control jtable con base de datos
Control jtable con base de datosControl jtable con base de datos
Control jtable con base de datos
 
Control jtable con base de datos
Control jtable con base de datosControl jtable con base de datos
Control jtable con base de datos
 

Ähnlich wie Javascript funcional

Ähnlich wie Javascript funcional (20)

Dart como alternativa a TypeScript (Codemotion 2016)
Dart como alternativa a TypeScript (Codemotion 2016)Dart como alternativa a TypeScript (Codemotion 2016)
Dart como alternativa a TypeScript (Codemotion 2016)
 
Pf con scala
Pf con scalaPf con scala
Pf con scala
 
Introducción a Scala
Introducción a ScalaIntroducción a Scala
Introducción a Scala
 
Problemas resueltos de operaciones con funciones ccesa007
Problemas resueltos de operaciones con funciones  ccesa007Problemas resueltos de operaciones con funciones  ccesa007
Problemas resueltos de operaciones con funciones ccesa007
 
Recursividad
RecursividadRecursividad
Recursividad
 
Hack (Lenguaje de Programacion)
Hack (Lenguaje de Programacion)Hack (Lenguaje de Programacion)
Hack (Lenguaje de Programacion)
 
Pensando funcionalmente
Pensando funcionalmentePensando funcionalmente
Pensando funcionalmente
 
Funciones en php
Funciones en phpFunciones en php
Funciones en php
 
Guia derivadas i_2017
Guia derivadas i_2017Guia derivadas i_2017
Guia derivadas i_2017
 
Introducción a Scala
Introducción a ScalaIntroducción a Scala
Introducción a Scala
 
4 Introducción al lenguaje Scala
4 Introducción al lenguaje Scala4 Introducción al lenguaje Scala
4 Introducción al lenguaje Scala
 
ECMAScript 6
ECMAScript 6ECMAScript 6
ECMAScript 6
 
Matlab2009b -clase2
Matlab2009b  -clase2Matlab2009b  -clase2
Matlab2009b -clase2
 
ORM Doctrine
ORM DoctrineORM Doctrine
ORM Doctrine
 
Charla congreso web introducción programación funcional en JavaScript
Charla congreso web introducción programación funcional en JavaScriptCharla congreso web introducción programación funcional en JavaScript
Charla congreso web introducción programación funcional en JavaScript
 
Parte2
Parte2Parte2
Parte2
 
Funciones Básicas - EMdH
Funciones Básicas - EMdHFunciones Básicas - EMdH
Funciones Básicas - EMdH
 
Lab
LabLab
Lab
 
JavaScript no es Vietnam
JavaScript no es VietnamJavaScript no es Vietnam
JavaScript no es Vietnam
 
operaciones con funciones.pptx
operaciones con funciones.pptxoperaciones con funciones.pptx
operaciones con funciones.pptx
 

Mehr von Leonardo Soto

El arte oscuro de estimar v3
El arte oscuro de estimar v3El arte oscuro de estimar v3
El arte oscuro de estimar v3Leonardo Soto
 
Una historia de ds ls en ruby
Una historia de ds ls en rubyUna historia de ds ls en ruby
Una historia de ds ls en rubyLeonardo Soto
 
El Lado Cool de Java
El Lado Cool de JavaEl Lado Cool de Java
El Lado Cool de JavaLeonardo Soto
 
Mi Arsenal de Testing en Rails
Mi Arsenal de Testing en RailsMi Arsenal de Testing en Rails
Mi Arsenal de Testing en RailsLeonardo Soto
 
Mapas en la web con Cloudmade
Mapas en la web con CloudmadeMapas en la web con Cloudmade
Mapas en la web con CloudmadeLeonardo Soto
 
Decent exposure: Controladores sin @ivars
Decent exposure: Controladores sin @ivarsDecent exposure: Controladores sin @ivars
Decent exposure: Controladores sin @ivarsLeonardo Soto
 
Sounds.gd lighting talk (RubyConf Uruguay)
Sounds.gd lighting talk (RubyConf Uruguay)Sounds.gd lighting talk (RubyConf Uruguay)
Sounds.gd lighting talk (RubyConf Uruguay)Leonardo Soto
 
Un tour por Java, Scala, Python, Ruby y Javascript
Un tour por Java, Scala, Python, Ruby y JavascriptUn tour por Java, Scala, Python, Ruby y Javascript
Un tour por Java, Scala, Python, Ruby y JavascriptLeonardo Soto
 
Lo que odiamos de la agilidad
Lo que odiamos de la agilidadLo que odiamos de la agilidad
Lo que odiamos de la agilidadLeonardo Soto
 
Jython: Python para la plataforma Java (EL2009)
Jython: Python para la plataforma Java (EL2009)Jython: Python para la plataforma Java (EL2009)
Jython: Python para la plataforma Java (EL2009)Leonardo Soto
 

Mehr von Leonardo Soto (20)

El arte oscuro de estimar v3
El arte oscuro de estimar v3El arte oscuro de estimar v3
El arte oscuro de estimar v3
 
Caching tips
Caching tipsCaching tips
Caching tips
 
Una historia de ds ls en ruby
Una historia de ds ls en rubyUna historia de ds ls en ruby
Una historia de ds ls en ruby
 
El Lado Cool de Java
El Lado Cool de JavaEl Lado Cool de Java
El Lado Cool de Java
 
Dos Años de Rails
Dos Años de RailsDos Años de Rails
Dos Años de Rails
 
Dos años de Rails
Dos años de RailsDos años de Rails
Dos años de Rails
 
Mi Arsenal de Testing en Rails
Mi Arsenal de Testing en RailsMi Arsenal de Testing en Rails
Mi Arsenal de Testing en Rails
 
Mapas en la web con Cloudmade
Mapas en la web con CloudmadeMapas en la web con Cloudmade
Mapas en la web con Cloudmade
 
Startechconf
StartechconfStartechconf
Startechconf
 
RabbitMQ
RabbitMQRabbitMQ
RabbitMQ
 
Decent exposure: Controladores sin @ivars
Decent exposure: Controladores sin @ivarsDecent exposure: Controladores sin @ivars
Decent exposure: Controladores sin @ivars
 
The Hashrocket Way
The Hashrocket WayThe Hashrocket Way
The Hashrocket Way
 
Sounds.gd lighting talk (RubyConf Uruguay)
Sounds.gd lighting talk (RubyConf Uruguay)Sounds.gd lighting talk (RubyConf Uruguay)
Sounds.gd lighting talk (RubyConf Uruguay)
 
Un tour por Java, Scala, Python, Ruby y Javascript
Un tour por Java, Scala, Python, Ruby y JavascriptUn tour por Java, Scala, Python, Ruby y Javascript
Un tour por Java, Scala, Python, Ruby y Javascript
 
Lo que odiamos de la agilidad
Lo que odiamos de la agilidadLo que odiamos de la agilidad
Lo que odiamos de la agilidad
 
Oss
OssOss
Oss
 
App Engine
App EngineApp Engine
App Engine
 
Introducción a Git
Introducción a GitIntroducción a Git
Introducción a Git
 
Tres Gemas De Ruby
Tres Gemas De RubyTres Gemas De Ruby
Tres Gemas De Ruby
 
Jython: Python para la plataforma Java (EL2009)
Jython: Python para la plataforma Java (EL2009)Jython: Python para la plataforma Java (EL2009)
Jython: Python para la plataforma Java (EL2009)
 

Kürzlich hochgeladen

Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudianteAndreaHuertas24
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfJulian Lamprea
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 

Kürzlich hochgeladen (13)

Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 

Javascript funcional

Hinweis der Redaktion