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?

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

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
Demetrio Ccesa Rayme
 
ORM Doctrine
ORM DoctrineORM Doctrine
ORM Doctrine
Decharlas
 

Ä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 v3
Leonardo Soto
 
El Lado Cool de Java
El Lado Cool de JavaEl Lado Cool de Java
El Lado Cool de Java
Leonardo Soto
 
Mi Arsenal de Testing en Rails
Mi Arsenal de Testing en RailsMi Arsenal de Testing en Rails
Mi Arsenal de Testing en Rails
Leonardo Soto
 
Mapas en la web con Cloudmade
Mapas en la web con CloudmadeMapas en la web con Cloudmade
Mapas en la web con Cloudmade
Leonardo Soto
 
Decent exposure: Controladores sin @ivars
Decent exposure: Controladores sin @ivarsDecent exposure: Controladores sin @ivars
Decent exposure: Controladores sin @ivars
Leonardo 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 Javascript
Leonardo Soto
 
Lo que odiamos de la agilidad
Lo que odiamos de la agilidadLo que odiamos de la agilidad
Lo que odiamos de la agilidad
Leonardo 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

redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
nicho110
 

Kürzlich hochgeladen (10)

investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
Guia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosGuia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos Basicos
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 

Javascript funcional

Hinweis der Redaktion