Taller de Programación Funcional en JavaScript

Click here to load reader

  • date post

    08-Jan-2017
  • Category

    Software

  • view

    4.666
  • download

    5

Embed Size (px)

Transcript of Taller de Programación Funcional en JavaScript

  • [email protected]

    [email protected]

    TallerdeProgramacinFuncionalenJavaScript

    Enero2016

  • @javiervelezreye2

    PresentacinTallerdeProgramacinFuncionalenJavaScript

    LicenciadoporlaUPMdesdeelao2001ydoctoreninform;caporlaUNEDdesdeelao2009,Javierconjugasuslaborescomoprofesore inves;gador con la consultora y la formacin tcnica paraempresa. Su lnea de trabajo actual se centra en la innovacin ydesarrollodetecnologasparalaWeb.Ademsrealizaac;vidadesdeevangelizacin y divulgacin en diversas comunidades IT y escoordinadordevariosgruposdembitolocalcomoNodeJSMadridoMadridJS.FormapartedelprogramaPolymerPolytechnicSpeakeryesmentordelcaptulodeMadriddeNodeSchool.

    QuinSoy?

    [email protected]

    @javiervelezreye

    linkedin.com/in/javiervelezreyes

    gplus.to/javiervelezreyes

    jvelez77

    javiervelezreyes

    youtube.com/user/javiervelezreyes

  • [email protected]

    [email protected]

    1Introduccin Introduccin Obje;vosdelaProgramacinFuncional PrincipiosdeDiseoFuncional

    Introd

    uccin

    Talle

    rdeProg

    ramac

    inFu

    nciona

    lenJS

  • @javiervelezreye4

    IntroduccinTallerdeProgramacinFuncionalenJavaScript

    Laprogramacinfuncionalesunviejoconocidodentrodelmundodeldesarrollo.Noobstante,en losl;mosaosest cogiendo traccindebido, entreotros factores, a la emergenciadearquitecturasreac;vas,alusodeesquemasfuncionalesenelmarcodeBigDatayalcrecientesoporte que se le da desde diversas plataformas vigentes de desarrollo. JavaScript ha sidosiempreun lenguajecon fuerte tendenciaaldiseo funcional.Eneste texto revisaremossusobje;vos y principios y discu;remos los mecanismos, tcnicas y patrones empleadosactualmenteparaconstruirarquitecturasfuncionaleshaciendousodeJavaScript.

    I.Introduccin

    ProgramacinFuncional

    ProgramacinOrientadaaObjetos

    Arquitecturascentradasenlatransformacin

    Variantesfuncionales

    TransparenciaReferencial

    Inmutabilidad

    ComposiEvidad

    PuntosdeExtensinPolimrfica Arquitecturas

    centradasenlaabstraccionesSusEtuEvidad

    LiskovianaEncapsulacinde

    estadoArquitecturas

    dirigidasporflujosdecontrol

    Arquitecturasdirigidasporflujosde

    datos

  • @javiervelezreye5

    IntroduccinTallerdeProgramacinFuncionalenJavaScript

    A.EspecificacinDeclaraPva

    II.ObjePvosdelaProgramacinFuncional

    La programacin funcional persigue disear especificaciones de comportamiento abstractoquesecentrenenladescripcindelascaracters;casdeunproblemamsqueenunaformapar;cularde resolverlo.Deacuerdoaesto, seen;endeque la responsabilidaddeencontraruna solucin para el problema descansa no tanto en manos del programador sino en laarquitecturafuncionalsubyacentequetomaencuentadichaespecificacin.

    Qu

    Cmo

    function total (type) { return basket.filter (function (e) { return e.type === type; }).reduce (function (ac, e) { return ac + e.amount * e.price; }, 0); }

    function total (type) { var result = 0; for (var idx = 0; idx < basket.length; idx++) { var item = basket[idx]; if (basket[idx].type === type) result += item.amount * item.price; } return result; }

    var basket = [ { product: 'oranges', type:'food', amount: 2, price:15 }, { product: 'bleach' , type:'home', amount: 2, price:15 }, { product: 'pears' , type:'food', amount: 3, price:45 }, { product: 'apples' , type:'food', amount: 3, price:25 }, { product: 'gloves' , type:'home', amount: 1, price:10 } ];

    La descripcin fluida del esElofuncional permite entender fcil-mentelaespecificacin

    Aunque operaEvamente es equivalente,el esElo imperaEvo es ms confuso yresultamsdiRcildeentender

    Objetos

    Funcional

  • @javiervelezreye6

    IntroduccinTallerdeProgramacinFuncionalenJavaScript

    B.AbstraccinFuncional

    II.ObjePvosdelaProgramacinFuncional

    La programacin funcional persigue alcanzar una especificacin de alto nivel que captureesquemas algortmicos de aplicacin transversal. Como veremos a con;nuacin, as sefomenta la reu;lizacin y la adaptacin idiom;ca. Esto se consigue con arquitecturascentradasenlavariabilidadfuncionalycontrastaortogonalmenteconlaorientacinaobjetos.

    var vehicles = [new Car(), new Truck(), ...]; var garage = function (vehicles) { for (v in vehicles) vehicles[v].test(); }; garage(vehicles);

    var phases = [ function body (v) {...}, function paint (v) {...} ]; var test = function (phases) { function (vehicle) { return phases.reduce(function (ac, fn) { return fn(ac); }, vehicle); } };

    AbstraccinFuncional

    AbstraccindePposObjetos

    Funcional

    V1 V2 V3

    Car Truck

    Bike

    vehicles

    body

    paint

    v

    EnFPlafuncineslaunidaddeabstraccinyaquepermite definir esquemas algortmicos quedependendefuncionespasadascomoparmetros

    En OOP los algoritmosse distribuyen entreobjetos con implemen-tacionesvariantes

  • @javiervelezreye7

    IntroduccinTallerdeProgramacinFuncionalenJavaScript

    C.ReuPlizacinFuncional

    II.ObjePvosdelaProgramacinFuncional

    Como consecuencia de la capacidad de abstraccin en la especificacin declara;va, laprogramacin funcionalalcanzacotaselevadasen la reu;lizacinde funciones.Esteniveldereu;lizacinalgortmicanoseconsigueenotrosparadigmascomoenlaorientacinaobjetos.

    El esquema algortmico se reuElizasobredisEntasestructurasdedatosycondisEntasaplicacionesfuncionales

    var users = [ { name: 'jvelez', sex: 'M', age: 35 }, { name: 'eperez', sex: 'F', age: 15 }, { name: 'jlopez', sex: 'M', age: 26 } ]; var adult = function (u) { return u.age > 18; }; var name = function (ac, u) { ac.push(u.name); return ac; }; get(users)(adult, name, []);

    var get = function (collection) { return function (filter, reducer, base) { return collection .filter(filter) .reduce(reducer, base); }; };

    var basket = [ { product: 'oranges', type: 'F', price:15 }, { product: 'bleach' , type: 'H', price:15 }, { product: 'pears' , type: 'F', price:45 }, ]; var food = function (p) { return p.type === 'F'; }; var total = function (ac, p) { return ac + p.price; }; get(basket)(food, total, 0);

  • @javiervelezreye8

    IntroduccinTallerdeProgramacinFuncionalenJavaScript

    D.AdaptacinFuncional

    II.ObjePvosdelaProgramacinFuncional

    Una de las virtudes de la programacin funcional es la capacidad de poder transformar lamorfologade las funcionesparaadaptarlasacadaescenariodeaplicacinreal.Entrminosconcretosestosignificapodercambiarlasignaturadelafuncinyenespeciallaformaenquese proporcionan los parmetros de entrada y resultados de salida. Veremos que existenmecanismostcnicasypatronesparaar;cularesteproceso.

    function greater (x, y) { return x > y; }

    function greater (x, y) { return y > x; }

    reverse

    (function greater (x) { function (y) { return y > x; } })(18)

    function greater (x) { function (y) { return y > x; } }

    curry

    parPal

    Se invierte el ordende aplica-cin de los parmetros deformatransparente

    Setransformalaevaluacindela funcinparaquepuedaserevaluadaporfases

    Se configura parcialmente lafuncin para obtener elpredicadodeadulto

  • @javiervelezreye9

    IntroduccinTallerdeProgramacinFuncionalenJavaScript

    E.DinamicidadFuncional

    II.ObjePvosdelaProgramacinFuncional

    La programacin funcional permite disear funciones que sean capaces de construirabstracciones funcionales de forma dinmica en respuesta a la demanda del contexto deaplicacin.Comoveremos, esteobje;vo se apoyaenmecanismosdeabstraccin y tambinabundaenlaadaptacinfuncionalqueacabamosdedescribir.

    isAdult('jlopez') isOld('jlopez') isYoung('jlopez')

    function greater (x) { return function (y) { return y > x; } }

    Se demanda un predicadofuncional que discrimine a losjubilados

    Se demanda un predicadofuncional que discrimine a losadultos

    Se demanda un predicadofuncional que discrimine a losjvenes

    La funcin greater es una factorafuncional que define comporta-mientosdinamicamente

    Proveedor

    Clientes

    var isOld = greater(65) var isYoung = greater(25)

    var isAdult = greater(25)

  • @javiervelezreye10

    IntroduccinTallerdeProgramacinFuncionalenJavaScript

    A.PrincipiodeTransparenciaReferencial

    III.PrincipiosdeDiseoFuncional

    Elprincipiodetransparenciareferencialpredicaqueentodaespecificacinfuncionalcorrecta,cualquierfuncindebepodersubs;tuirseencualquiermbitodeaplicacinporsuexpresinfuncional sin que ello afecte al resultado obtenido. La interpretacin de este principio dediseo;enetreslecturascomplementarias.

    FuncionesPuras

    Dado que el predicado greater slo depende desusparmetrosdeentradaxey, se tratadeunafuncin pura. Por ello,manEene la transparenciareferencialpermiEendosususEtucinsin impactoenlasemnEcadelcontextodeaplicacin

    var old = greater(65)

    var old = (function greater (x) { function (y) { return y > x; } })(65);

    Se dice que una funcin es pura recuerda al es;lo decomportamiento matem;co si su valor de retorno slodepende de los parmetros de entrada y no del estadoambiental (variables globales, variables retenidas en mbitolxico,operacionesdeE/S,etc.).

    fEstado

  • @javiervelezreye11

    IntroduccinTallerdeProgramacinFuncionalenJavaScript

    A.PrincipiodeTransparenciaReferencial

    III.PrincipiosdeDiseoFuncional

    Elprincipiodetransparenciareferencialpredicaqueentodaespecificacinfuncionalcorrecta,cualquierfuncindebepodersubs;tuirseencualquiermbitodeaplicacinporsuexpresinfuncional sin que ello afecte al resultado obtenido. La interpretacin de este principio dediseo;enetreslecturascomplementarias.

    ComportamientoIdempotente

    pop + pop === 2 * pop

    Se dice que una funcin es idempotente si siempre devuelve elmismo resultado para los mismos parmetros de entrada. Ennuestroejemplodeberaverificarseestaigualdad:

    function Stack () { var items = []; return { push: function (e) { items.push(e); }, pop: function () { return items.pop(); } }; }

    function Stack () { return { stack: [] }; } function push (s, e) { return { stack: s.stack.concat(e), top: e }; } function pop (s) { var stack = [].concat(s.stack); var e = stack.pop(); return { stack: stack, top: e }; }

    EsPloOrientadoaObjetos

    EsPloFuncionalLa pila manEene el estadointernoylasoperacionespushypopnoresultanidempotentes

    El estado se manEene externa-menteysepasacomoparmetroa cada operacin con lo que elcomportamientoesidempotente

  • @javiervelezreye12

    IntroduccinTallerdeProgramacinFuncionalenJavaScript

    A.PrincipiodeTransparenciaReferencial

    III.PrincipiosdeDiseoFuncional

    Elprincipiodetransparenciareferencialpredicaqueentodaespecificacinfuncionalcorrecta,cualquierfuncindebepodersubs;tuirseencualquiermbitodeaplicacinporsuexpresinfuncional sin que ello afecte al resultado obtenido. La interpretacin de este principio dediseo;enetreslecturascomplementarias.

    AgnosPcismodeEstado

    La entrada acumula toda lainformacin ambiental enformadeestado

    clean

    words

    count

    Entrada

    Salida

    FronterasArquitectnicas

    Dentro de la arquitectura el estado esacarreado como parmetro a lo largodelacadenadetransformacin

    Cadaabstraccinenelmbitoarquitec-tnico es una funcin pura que hacedepender su salida exclusivamente desusparmetrosdeentrada

    Todo problema de aplicacin real se caracteriza por un estadointrnseco.Elagnos;cismodeestadononiegaestarealidad.Ensulugar,el principio debe interpretarse como que dentro de las fronteras delsistema el comportamiento funcional slo puede depender de losparmetrosexplcitamentedefinidosencadafuncin.

  • @javiervelezreye13

    IntroduccinTallerdeProgramacinFuncionalenJavaScript

    B.PrincipiodeInmutabilidaddeDatos

    III.PrincipiosdeDiseoFuncional

    En el modelo de programacin impera;va, la opera;va de computo se en;ende como unproceso secuencial y paula;no de transformacin del estadomantenido por la arquitecturahardware de la mquina. En programacin funcional y en virtud de la transparenciareferencial las funciones no dependen del estado ambiental. De ello se colige que elconceptodevariableentendidocomodepositoactualizabledeinformacinnoexiste.

    var x = 1 ... x = x + 1

    [email protected](0) = 1 ... [email protected](t+1) = [email protected](t) + 1

    En programacin imperaEva las variables seenEenden como depsitos de informacin enmemoriaquepuedenactualizarseduranteelEempode vida del programa. La dimensin Eempo quedaocultayestodificultaelrazonamiento

    Laprogramacinfuncionalponeestrsenqueloscambiosen los datos de un programa deben manifestarse comofuncionessobreladimensinEempo.Estosignificaqueelconceptodevariablescomodepositodeinformacinylasoperaciones de actualizacin sobre ellas no estnpermiEdas

    ImperaPvo P.Funcional

    En trminos prc;cos la aplicacin se esteprincipio se traduce en que las funciones nuncadeben actualizar los parmetros de entrada sinogenerarapar;rdeellosresultadosdesalida

    function push (s, e) { return s.push(e); } function push(s, e) { return s.concat(e); }

    Semodificas

    Nosemodificas

    EsPloImperaPvo

    EsPloFuncional

  • @javiervelezreye14

    IntroduccinTallerdeProgramacinFuncionalenJavaScript

    C.PrincipiodeComputacinCentradaenColecciones

    III.PrincipiosdeDiseoFuncional

    Adiferenciade loqueocurreenotrosparadigmascomoenorientacinaobjetosdonde losdatos seorganizan en formade grafos relacionales, enprogramacin funcional stos debenmodelarsecomocoleccionesarraysodiccionariosenJavaScriptparaqueselespuedasacarpleno par;do1. Se dice que el modelo de computacin de la programacin funcional estcentradoencolecciones.

    SetUn conjunto se modela comoun array o un diccionario debooleanos

    1 3

    4

    [true, false, true, true]

    BagUna bolsa se modela como unundiccionariodecontadores

    a b

    c

    {a: 2, b: 3, c: 1}

    a b b

    BinaryTreeUn array se aplana como unacoleccin anidada de arrays de3 posiciones, rbol izquierdo,nodo,rbolderecho

    1

    5 2

    HeapUna cola con prioridad es undiccionariodearraysounarraydearrays

    {1: [a, c], 2: [b, c, d], 3: [f]}

    7 6 4 3

    [ [ [[],3,[]], 2, [[],4,[]]], 1, [[[],6,[]], 5, [[],7,[]]] ]

    a c

    b d e

    f

    1

    2

    3 [ [a, c], [b, c, d], [f] ]

    1 Los diccionarios son una aproximacin derepresentacin aceptable en tanto quepuedenprocesarsecomocoleccionesdeparesclave-valor

  • @javiervelezreye15

    IntroduccinTallerdeProgramacinFuncionalenJavaScript

    D.PrincipiodeDiseoDirigidoporCapas

    III.PrincipiosdeDiseoFuncional

    Laconstruccindearquitecturasfuncionalessigueunprocesodediseodirigidoporcapasoniveles de especificacin. Desde las abstracciones ms generales encontradas en librerasfuncionalesseconstruyeunnivel idiom;coqueproponeunesquemaabstractodesolucinparaelproblemapropuestoysloentoncesseconcretaeneldominiopar;culardelproblema.

    var users = [{ name: 'jlopez', sex: 'M', age: 26 } ...]; var male = function (u) { return u.age > 18; }; var name = function (ac, u) { ac.push(u.name); return ac; }; get(users)(male, name, []);

    var get = function (collection) { return function (filter, reducer, base) { return collection .filter(filter) .reduce(reducer, base); }; };

    map reduce filter ...

    NiveldeDominioSe contextualiza el esquemaanterior dentro del dominio deaplicacin concretando condatosyfuncionesespecficas

    NivelIdiomPcoSe crea un esquema funcionalque resuelve la familia deproblemas al que pertenece elproblemaplanteado

    NiveldeLibreraSe uElizan funciones generalesconunaltoniveldeabstraccin

    NiveldeAb

    straccin

    ReuPlizacinTransversalaDominio

  • [email protected]

    [email protected]

    2JavaScriptcomoLenguajeFuncional DefinicinFuncionalporCasos DefinicinporRecursin ExpresionesFuncionalesdeInvocacinInmediataIIFE DefinicinenOrdenSuperior Clausuras&RetencindeVariables Java

    Scrip

    tcom

    oLe

    ngua

    jeFun

    cion

    al

    Talle

    rdeProg

    ramac

    inFu

    nciona

    lenJS

  • @javiervelezreye17

    JavaScriptcomoLenguajeFuncionalTallerdeProgramacinFuncionalenJavaScript

    Comoyahemoscomentado,losprocesosdeprogramacinfuncionalconsistenesencialmenteen la definicin de una coleccin de declaraciones funcionales que puedan adaptarse adis;ntosnivelesdeabstraccinyaplicarseconjugadamentepararesolverproblemasdeformadeclara;va. Para ar;cular estas tareas de definicin el paradigma funcional ofrece unacoleccindemecanismosesencialesquerevisamosenestecaptulo.

    I.Introduccin

    TcnicasPF

    PatronesPF

    Elnivelde lenguajeest formadopor la coleccin de mecanismosdeprogramacinqueproporcionaellenguajedeformanaEva

    NiveldeLenguaje

    Las deficiencias que por suconcepcin presenta el lenguajese deben suplir a este nivel poraplicacin de tcnicas y patronesde diseo que revisaremos enprximoscaptulos

    NivelIdiomPcoApp App App

    Defin

    icinpo

    rcasos

    recursividad

    Expresione

    sIIFE

    Orden

    Sup

    erior

    Clau

    suras

    RetencinVariables

    SobrecargaFun

    cion

    al

    Defin

    icinpo

    rPatrone

    s

    JSFuncional

  • @javiervelezreye18

    JavaScriptcomoLenguajeFuncionalTallerdeProgramacinFuncionalenJavaScript

    A.DefinicinFuncionalporCasos

    II.MecanismosdeProgramacinFuncional

    La forma ms sencilla de definir una funcin es diseando explcitamente la coleccin devaloresderetornoquedebedevolverparacadaposibleparmetrodeentrada.Aunqueestemecanismo parece poco flexible aisladamente, cuando se conjuga con otras formas dedefinicinresultadeaplicacinfrecuente.

    La definicin por casos se expresadeclarandoexplcitamenteelvalorquedebe devolver la funcin para cadaposible valor de los parmetros deentrada

    function f (parmetros) { return caso-1 ? resultado-1 : caso-2 ? resultado-2 : resultado-defecto; }

    El uso anidado del operadorcondicional permite expresar lospares caso-resultado como unanicaexpresinderetorno

    nicaExpresin

    EnumeracinExplcitadecasos

    function comparator(x) { return x > 0 ? 1 : x === 0 ? 0 : -1 ; }

    function even(n) { return n % 2; }

    Se uEliza el operador condicionalanidado para definir cada casofuncional

    La definicin mediante una nicaexpresin es el escenario mssencillodedefinicinporcasos

  • @javiervelezreye19

    JavaScriptcomoLenguajeFuncionalTallerdeProgramacinFuncionalenJavaScript

    B.DefinicinporRecursin

    II.MecanismosdeProgramacinFuncional

    Ladefinicindefuncionesporrecursinconsisteen la invocacinde lapropia funcincomopartedelprocesodedefinicin.Elesquemadedefinicinrecursivoseapoyaenelmecanismoanterior para dis;nguir entre casos base aqullos que devuelven un resultado final deaqulloscasosrecursivosdondeelvalorderetornovuelveainvocaralapropiafuncin.

    function f (parmetros) { return caso-base-1 ? resultado-base-1 : caso-base-2 ? resultado-base-2 : caso-recursivo-1 ? resultado-recursivo-1 : caso-recursivo-2 ? resultado-recursivo-2 : resultado-defecto ; }

    Loscasosbasesonelfinaldelprocesorecursivoysesuponensoluciones inmediatas aproblemassencillos

    CasosbaseLos casos recursivos sedisean invocando a lapropia funcin sobrevalores de parmetrosque convergen a loscasosbase

    Casosrecursivos

    Asegrese de que cada resultadorecursivo converge a alguno de loscasosbase

    II.RegladeconvergenciaI.RegladecoberturaAsegrese de que todos los casosbasedelproblemahansido incluidosexplcitamente en la definicin de lafuncin

    Para disear cada caso recursivoasumaquelafuncinpordefinirestya defin ida para va lo res deparmetrosmsprximosaloscasosbase

    III.Regladeautodefinicin

  • @javiervelezreye20

    JavaScriptcomoLenguajeFuncionalTallerdeProgramacinFuncionalenJavaScript

    B.DefinicinporRecursin

    II.MecanismosdeProgramacinFuncional

    Enfuncindecmoseexpresanloscasosrecursivosdeunafuncinpodemosdis;nguirentredos;posdesituaciones.Enlarecursindirecta,loscasosrecursivosdelafuncinseexpresanen trminos de llamadas a ella misma. En la recursin indirecta, la funcin invoca a otrafuncinquerecurresobrelaprimera.

    RecursinDirecta

    function factorial (n) { return n === 0 ? 1 : n * factorial(n - 1); }

    factorial(4) = 4 * factorial(3) = 4 * 3 * factorial(2) = 4 * 3 * 2 * factorial(1) = 4 * 3 * 2 * 1 * factorial(0) = 4 * 3 * 2 * 1 * 1 = 24

    RecursinIndirecta

    function even (n) { return n === 0 ? true : !odd(n-1); } function odd (n) { return n === 0 ? false : !even(n-1); }

    even(4) = !odd(3) = !!even(2) = !!!odd(1) = !!!!even(0) = !!!!true = true

    Los casos recursivos convergenhacialoscasosbasereduciendoeltamao del problema en unaunidadacadapaso

    Laconvergenciahacialoscasosbaseva incluyendo un operador denegacin que se resuelven al llegaralcasobase

  • @javiervelezreye21

    JavaScriptcomoLenguajeFuncionalTallerdeProgramacinFuncionalenJavaScript

    B.DefinicinporRecursin

    II.MecanismosdeProgramacinFuncional

    Dadoque la programacin funcional no disponede estructuras de control de flujo, la nicaformade resolver problemas que requierenun computo itera;vo es expresarlas a par;r deunaformulacinrecursiva.Aunquepuederesultarenprincipiomscomplejo,laexpresividadfuncional aumenta con este ;po de expresiones. Adems hay problemas que ;enen unaresolucininherentementerecursiva.

    ProblemadelasTorresdeHanoi

    Moverdiscosdeunoenunoparadejarlosenlamisma posicin de A en C usando B comoauxiliar. Los discos por encima de uno dadodebensersiempredemenortamaoqueste.

    function hanoi (n, origen, aux, destino) { if (n === 1) mover(origen, destino); else { hanoi(n-1, origen, destino, aux); mover(origen, destino); hanoi(n-1, aux, origen, destino); } } function mover (origen, destino) { destino.push (origen.pop()); } var A = [4, 3, 2, 1], B = [], C = [] hanoi(A, B, C);

    A B C

    n-1

    1

    n-1

    1

    2

    3

  • @javiervelezreye22

    JavaScriptcomoLenguajeFuncionalTallerdeProgramacinFuncionalenJavaScript

    C.ExpresionesFuncionaleseInvocacinInmediata

    II.MecanismosdeProgramacinFuncional

    Noenpocasocasiones lanecesidaddedefinirunafuncinserestringeaunsolousoqueserealiza a con;nuacin de su definicin. Si encerramos una definicin de funcin entreparntesisyaplicamosa laexpresin resultanteeloperadorde invocacin losparmetrosactuales a su vez entre parentesis y separados por comas obtenemos una expresinfuncionaldeinvocacininmediataIIFE.

    (function f (parmetros-formales) { })(parmetros-actuales);

    La expresin funcional se invocadirectamente por aplicacin de losparmetrosactuales

    La definicin funcional se encierraentreparntesisparaconverErlaenunaexpresinevaluable

    ExpresinFuncional InvocacinInmediata

    var cfg = (function config(user) { // getting config from DB return {...} })('jvelez');

    Uncpicoejemplode IIFE sedacuandosepretendenrealizarclculoscomplejosotareasqueseefectuarnunasolavezalolargodelcdigo

    LaventajadeesteEpodeconstruccionesesquelafuncinseliberadelamemoriatrassuejecucin

  • @javiervelezreye23

    JavaScriptcomoLenguajeFuncionalTallerdeProgramacinFuncionalenJavaScript

    D.DefinicinenOrdenSuperior

    II.MecanismosdeProgramacinFuncional

    EnJavaScriptlasfuncionessonciudadanosdeprimerorden.Estoquieredecirqueatodoslosefectos no existe ningn;podediferencia entre una funcin y cualquier valor de otro;poprimi;vo. Esto permite a una funcin recibir otras funciones como parmetros o devolverfuncionescomoretorno.Estemecanismoseleconoceconelnombredeordensuperior.

    FuncionescomoParmetrosaOtrasFunciones

    El paso de funciones como parmetros a una funcinpermite que el comportamiento de sta sea adaptada pormediodelainyeccindecdigovarianteencadainvocacin.Esta aproximacin contrasta con la programacin por ;posvariantespropiadelaorientacinaobjetos.

    FuncionescomoRetornodeOtrasFunciones

    Lasfuncionessoncapacesdegenerardinmicamentefuncionesquedevuelvencomoresultado.Estoesdeespecial inters cuando la funcin devuelta es elresultado de transformar una funcin recibida comoargumento.Esteprocesojus;ficaelnombredeordensuperioryaqueseoperaconfuncionesgenricas.

    function once (fn) { var called = false; return function () { if (!called) { called = true; return fn.apply(this, arguments); } } }

    var greater = function (x, y) {...}; var less = function (x, y) {...}; var even = function (x) {...}; [1, 4, 3, 2].sort(greater); [1, 4, 3, 2].sort(less); [1, 4, 3, 2].filter(even);

  • @javiervelezreye24

    JavaScriptcomoLenguajeFuncionalTallerdeProgramacinFuncionalenJavaScript

    E.Clausuras&RetencindeVariables

    II.MecanismosdeProgramacinFuncional

    Las funciones que, por medio de los mecanismos de orden superior, devuelven funcionescomoresultadosepuedenexpresarentrminosdevariableslocalesoparmetrospresentesenelentornofuncionaldondesedefinen.Laretencindevariableseselmecanismomedianteel cual dichas variables y parmetros sonmantenidos durante todo el ;empode vida de lafuncinderetorno.Este;podefuncionessedenominanclausuras.

    function Logger(cls) { var pre = 'Logger'; var post = '...'; return function (message) { console.log ('%s[%s] - [%s]%s', pre, cls, message, post); } }

    var log = Logger('My Script'); Log('starting'); log(1234); log('end');

    function (message) {...}

    pre post cls

    Clausura

    Las clausuras son un mecanismos deconstruccinfuncionalquecapturadeformapermanenteunestadodeconfiguracinquecondicionasucomportamiento

    VariablesRetenidasAl extraer una funcin fuera de su mbitolxicodedefinicin semanEeneel contextodevariablesyparmetrosquedichafuncinuEliza.

  • [email protected]

    [email protected]

    3TcnicasdeProgramacinFuncional Abstraccin Encapsulacin InmersinporRecursinyAcumulacin EvaluacinParcial ComposicinFuncional&ComposicinMondica Tcn

    icas

    deProg

    ramac

    inFu

    nciona

    l

    Talle

    rdeProg

    ramac

    inFu

    nciona

    lenJS

  • @javiervelezreye26

    TcnicasdeProgramacinFuncionalTallerdeProgramacinFuncionalenJavaScript

    Apar;rde losmecanismosqueofrece JavaScript como lenguajedeprogramacin sepuedeescribirsoewarebiencentradoenelparadigmafuncional.Noobstante,paraelloesnecesarioconocerunacoleccindetcnicasbsicasquedescribenformascannicasdehacer frenteaproblemasrecurrentes.A lo largodeestecaptuloharemosunarevisinde las tcnicasmsrelevantes.

    I.Introduccin

    Lastcnicasdeabstraccinpermitendefinirespecificacionesfuncionalescondiferentesgradosdegeneralidadyreu;lizacintransversal

    AbstraccinEnfuncionallaencapsulacindeestadoesunmalavecesnecesarioyenmuchasocasionespuedereemplazarseporencapsulacindecomportamiento

    EncapsulacinLastcnicasdeinmersinsonunacon-jugacindeabstraccin,encapsulacinyrecursividadparaobtenercontroldeflujodirigidopordatos

    Inmersin

    Laevaluacinparcialpermiteevaluarunafuncinenvariasfasesreduciendopaula;namenteelnmerodevariableslibres

    EvaluacinParcialLacomposicinfuncionalpermitear;cularprocesosdesecuenciamientodefuncionesdefinidascomoexpresionesanal;cas

    ComposicinFuncionalLatransformacinmondicapersigueadaptarfuncionesparaconver;rlasentransformacionespurasquesoportenprocesosdecomposicin

    TransformacinMondica

    Lainversindecontrolpermitepermutarentrelasarquitecturasfuncionalescentradasenlosdatosylascentradasenlastransformaciones

    InversindeControl

  • @javiervelezreye27

    TcnicasdeProgramacinFuncionalTallerdeProgramacinFuncionalenJavaScript

    A.TcnicasdeAbstraccin

    II.TcnicasdeProgramacinFuncional

    Una de las tcnica de programacin funcionalms comnmente u;lizadas, en alineamientoconlosprincipiosdediseopresentadosanteriormente,eslaabstraccinfuncional.Lastareasdeabstraccindebenentendersecomounprocesodetransformacinenelqueladefinicindeunafuncinsereexpresaentrminosmsgeneralesparadarcoberturaaunabanicomsampliodeescenariosdeaplicacin.Podemosdis;nguirtresdimensionesdeabstraccin.

    AbstraccinenAnchura

    Suma convencional de dos n-meros pasados como para-metros

    add(x, y)

    add

    Combinamediante la funcin ctodos los parmetros a parErdeunodadoenposicinp

    reduceFrom(p, c)(x, y, )

    reduceFrom

    Suma todos los parmetros dela funcin independientementedelaaridad

    addAll(x, y, z, )

    addAll

    Suma todos los parmetros delafuncinaparErdeaqulqueocupaunaposicinp

    add(p)(x, y, z, )

    addFromAbstraccinenComportamiento

    AbstraccinenAlcance

  • @javiervelezreye28

    TcnicasdeProgramacinFuncionalTallerdeProgramacinFuncionalenJavaScript

    B.TcnicasdeEncapsulacin

    II.TcnicasdeProgramacinFuncional

    Medianteelusodeclausurasylaretencindevariablesesposiblecapturar,durantelafasedediseooejecucin,ciertainformacinqueresultadeu;lidadparaadaptarelcomportamientode la funcina lo largodel;empo.Esposibledis;nguirentreencapsulacindeestadoydecomportamiento.

    EncapsulacindeEstado.PilaUndo

    function Stack () { var items = []; var history = []; return { push: function (e) { history.push([].concat(items)); items.push(e); }, pop: function () { history.push([].concat(items)); return items.pop(); }, undo: function () { if (history.length > 0) items = history.pop(); } }; }

    Lasvariablesquecapturanelestadoquedanretenidas dentro de la clausura lo quepermite arEcularmodelos de programacinfuncionalqueevolucionanconelEempo

    RetencindeEstado

    Ojo! Las funciones que dependen del estado son enrealidadunamalaprcEcadeprogramacindeacuerdoalosprincipiosdediseodelparadigma

    DependenciadeEstado

    1

    2

    3

    1

    1 2

    2 31

    items history

    undo

  • @javiervelezreye29

    TcnicasdeProgramacinFuncionalTallerdeProgramacinFuncionalenJavaScript

    B.TcnicasdeEncapsulacin

    II.TcnicasdeProgramacinFuncional

    Medianteelusodeclausurasylaretencindevariablesesposiblecapturar,durantelafasedediseooejecucin,ciertainformacinqueresultadeu;lidadparaadaptarelcomportamientode la funcina lo largodel;empo.Esposibledis;nguirentreencapsulacindeestadoydecomportamiento.

    EncapsulacindeComportamiento.PilaUndofunction Stack () { var items = []; var history = []; return { push: function push (e) { history.push(function(){items.pop()}); items.push(e); }, pop: function pop () { var e = items.pop(); history.push(function(){items.push(e);}); return e; }, undo: function undo() { if (history.length > 0) history.pop()(), } }; }

    Dentro de cada operacin, se registran en elhistrico las operaciones inversas para luegoinvocarlasdesdelaoperacindeshacer

    Enestecasolavariabledehistricocapturala coleccin de operaciones inversas quepermiten deshacer las transacciones segnhanidosucediendo

    RetencindeComportamiento

    OperacionesInversas

    1

    2

    3

    pop

    items history

    undopop pop

    poppoppop

  • @javiervelezreye30

    TcnicasdeProgramacinFuncionalTallerdeProgramacinFuncionalenJavaScript

    B.TcnicasdeEncapsulacin

    II.TcnicasdeProgramacinFuncional

    Medianteelusodeclausurasylaretencindevariablesesposiblecapturar,durantelafasedediseooejecucin,ciertainformacinqueresultadeu;lidadparaadaptarelcomportamientode la funcina lo largodel;empo.Esposibledis;nguirentreencapsulacindeestadoydecomportamiento.

    EncapsulacindeComportamiento.Bus

    function Bus () { var fns = {}; return { receive: function (e, fn) { fns[e] = fn; }, send: function (e, ctx) { return fns[e].apply(null, ctx); } }; } var bus = Bus(); bus.receive('add', function (x,y) {return x+y;}); bus.receive('sub', function (x,y) {return x-y;}); bus.send('add', [3,2]); bus.send('sub', [7,3]);

    bus

    fn

    sub x-y

    x+yadd

    event

    El productor emite con laoperacinsenduneventoalosreceptores

    send

    send('add', [3,2])

    El consumidor ser eg i s t r a en l o seventosdeinters

    receive receive('add', +)

    3+2

  • @javiervelezreye31

    TcnicasdeProgramacinFuncionalTallerdeProgramacinFuncionalenJavaScript

    C.DiseoporInmersin

    II.TcnicasdeProgramacinFuncional

    Dado que la programacin funcional no soporta los esquemas itera;vos propios de laprogramacinimpera;va,esprecisoorientarlosclculosalarecurrenciaapoyndoseparaelloenparmetrosauxiliares.Lastcnicasdeinmersinconjuganencapsulacinyabstraccinconelusodeparmetrosauxiliares.Podemosdis;nguirdiferentes;posdeinmersin.

    function find (v, e) { var aux = function (v, e, p) { return (p > v.length) ? -1 : (v[p] === e) ? p : aux(v, e, p + 1); }; return aux(v, e, 0); }

    I.InmersinporRecorrido

    function addAll (v) { return (function aux(v, p) { if (p === v.length-1) return v[p]; else return v[p] + aux (v, p+1); }) (v, 0); }

    LainmersinderecorridoexEendelafuncin introduciendo un nuevoparmetrocuyopropsitoesllevarlacuenta del punto hasta el que se haavanzadoenelvector.

    aux([1,2,3], 0) = 1 + aux([1,2,3], 1) = 1 + 2 + aux ([1,2,3], 2) = 1 + 2 + 3 = 6

    La tcnica se apoya es unaabstraccin que quedasumergidadentrodelamsespecficaporencapsulacin

    321

    p >

  • @javiervelezreye32

    TcnicasdeProgramacinFuncionalTallerdeProgramacinFuncionalenJavaScript

    C.DiseoporInmersin

    II.TcnicasdeProgramacinFuncional

    Dado que la programacin funcional no soporta los esquemas itera;vos propios de laprogramacinimpera;va,esprecisoorientarlosclculosalarecurrenciaapoyndoseparaelloenparmetrosauxiliares.Lastcnicasdeinmersinconjuganencapsulacinyabstraccinconelusodeparmetrosauxiliares.Podemosdis;nguirdiferentes;posdeinmersin.

    II.InmersinporAcumulacin

    La acumulacin se aplicaaqu para obtener recursi-vidad final buscando laeficienciaenmemoria

    321

    p,ac >

    function addAll (v) { return (function aux(v, p, ac) { if (p === v.length) return ac; else return aux (v, p+1, v[p]+ac); })(v, 0, 0); }

    function even (v) { return (function aux(v, p, ac){ if (p === v.length) return ac; else { if (v[p] % 2 === 0) ac.push(v[p]); return aux(v, p+1, ac); } })(v, 0, []); }

    Se uEliza la tcnica de acumulacinpara consolidad un vector formadopor el subconjunto de los elementosparesdelvector

    Reduccin

    TailRecursion

    aux([1,2,3], 0, 0) = aux([1,2,3], 1, 1) = aux ([1,2,3], 2, 3) = aux ([1,2,3], 3, 6) = 6

  • @javiervelezreye33

    TcnicasdeProgramacinFuncionalTallerdeProgramacinFuncionalenJavaScript

    D.EvaluacinParcial

    II.TcnicasdeProgramacinFuncional

    El uso de clausuras permite transformar una funcin para que pueda evaluarse demaneraparcial resolviendo slo algunos de sus parmetros. El resultado es una nueva funcin conmenosgradosdelibertaddondelosparametrosyaevaluadossefijanaunvalorconcretoyelrestoquedancomovariableslibres.

    function color(rr) { return function (gg) { return function (bb) { return [rr, gg, bb] ; }; }; }

    I.DimensionesContractuales

    A diferencia de lo que ocurre en otrosparadigmas, el diseo funcional deabstracciones;enedosdimensionesdedefinicin, la dimensin espacial y ladimensintemporal.

    En la dimensin temporalcada fase conduce a unaetapa de resolucin parcialdeparmetros

    La dimensin espacial vinculaconvencionalmente valores actualesaparmetros

    Desde la fase 1 a la fase 2 seresuelve el parmetro rr yquedan dos dimensiones libresdemovimiento(gg,bb) II.ReduccinDimensional

    Cada fase de aplicacin temporal deparmetros conduce a una reduccindimensionalenelespaciodelproblema.

    bb

    gg

    rr bb

    gg

    rr = cc

    color('cc')('a3')('45')

  • @javiervelezreye34

    TcnicasdeProgramacinFuncionalTallerdeProgramacinFuncionalenJavaScript

    D.EvaluacinParcial

    II.TcnicasdeProgramacinFuncional

    Elusodelaevaluacinparcialpermitequeelprogramadorvayaresolviendodeformafaseadala evaluacin de una funcin a medida que va disponiendo de los argumentos actualesnecesarios.Enestoscasos,eldiseodelafuncindebecuidarseparagaran;zarqueelordenenelquesedemandanlosparmetrosalolargodel;empocorrespondeconelesperadoenelcontextoprevistodeuso.

    Ejemplo.EvaluacinporFases

    function schema (scheme) { var uri = { scheme : scheme }; return function (host) { uri.host = host; return function (port) { uri.port = port; return function (path) { uri.path = path; return function () { return uri; }; }; }; }; }

    Se arEcula un proceso de construccin porfasesquepermiteinyectarlaspartesdeunaUri.EsteesquemarecuerdaalpatrnBuilderdeOOPperousandonicamentefunciones

    var host = schema('http'); var port = host('foo.com'); var path = port(80); var uri = path('index.html'); uri();

    Aunque la aplicacin de esteesquema induce un estrictoorden en la resolucin para-mtrica permite resolver porfaseselprocesoconstrucEvoamedida que se dispone de losdatos

  • @javiervelezreye35

    TcnicasdeProgramacinFuncionalTallerdeProgramacinFuncionalenJavaScript

    D.EvaluacinParcial

    II.TcnicasdeProgramacinFuncional

    Otro escenario protogpico del uso de la evaluacin parcial se da en la comunicacin entrefuncionesproveedorasyclientes.Elproveedorresuelveparcialmenteunafuncinreduciendoas el nmero de dimensiones y la entrega en respuesta a la demanda de un cliente queresolverelrestodedimensionesconargumentosactualesensucesivasinvocaciones.Enestecaso, el diseo funcional debe fasearse teniendo en cuenta la intervencin primera delproveedoryposteriordelcliente.

    TransferenciaProveedor-Consumidor

    function RuleEngine (ctx) { return function eval(rule) { return function () { var args = [].slice.call(arguments); if (rule.trigger.apply(ctx, args)) return rule.action.apply(ctx, args); }; }; } var rE = RuleEngine({age: 18, login: false});

    rE ({ trigger: function (age) { return age > this.age; }, action: function () { return this.login = true; } })(19); rE ({ trigger: function () { return this.login; }, action: function () { return 'Bienvenido!'; } })();

    Elproveedorresuelveparcialmenteunafuncinevalylaentregacomoresultadoalafuncincliente

    La funcin obtenida del proveedorpermite al cliente evaluar reglas queseapoyanenlasvariablesretenidas

    rE ctx

    function eval(rule) {}

    Proveedor

    RuleEngineRuleEngine(ctx)

    Cliente

  • @javiervelezreye36

    TcnicasdeProgramacinFuncionalTallerdeProgramacinFuncionalenJavaScript

    E.ComposicinFuncional

    II.TcnicasdeProgramacinFuncional

    Dado que en programacin funcional las abstracciones sonmeras transformaciones que nopuedenar;cularunalgoritmosecuencial,esfrecuentemodelarelsecuenciamientoenbasealacomposicin.Deestamanera,elvalorderetornodeuna funcinsirvedeentradapara lafuncinsubsiguiente.

    function clean (s){ return s.trim(); } function words (s){ return s.split(' '); } function count (s){ return s.length; } count( words( clean('La FP en JS Mola!!!') ) );

    clean

    words

    count

    s

    5 LacascadadecomposicinfuncionalserecorreensenEdoinversoalnatural.Losdatoscomienzanporlafuncinmsinterna(clean)yatraviesanlacadenadecomposicinascendentementehastalacima(count).Enelcaptulosiguienteestudiaremospatronesqueconducenaunalecturadescendentemsnatural

    La organizacin composiEva de funcionesconduce a arquitecturas centradas en lastransformaciones que los datos atraviesan encascada

  • @javiervelezreye37

    TcnicasdeProgramacinFuncionalTallerdeProgramacinFuncionalenJavaScript

    E.ComposicinFuncional

    II.TcnicasdeProgramacinFuncional

    Enocasioneslaformaenlaquesedefinenlasabstraccionesfuncionalesnoescompa;bleconlosprocesosdecomposicin.Parapoderar;cularadecuadamentedichosprocesosdebemostenerencuentadosreglasdetransformacinfuncionalquepuedesernecesarioaplicarparaconseguirfuncionescomposi;vas.

    El Epo del parmetro de entrada de unafuncindebesercompaEbleconelEpodelvalor de retorno devuelto por la funcinanterior para que la composicin puedaarEcularseconxito

    II.CompaPbilidadRango-Dominio

    I.DominioSimpleDado que una funcin f devuelve un nicovalorderetorno,elnmerodeparmetrosqueaceptaunafuncingcuandosecomponeconfdebe ser exactamente uno. ParamiEgar esteproblemaesposible encapsular los resultadosde f en una estructura de datos y/o resolvertodos los parmetros de g menos uno pormediodeevaluacinparcial

    F

    GT

    U ElEpodesalidaTdebesercompaEbleconel Epo de entrada U. En trminos OOPdiramosqueTdebesersubEpodeU

    count( words( clean(s) ) );

    [String]-> Number String -> [String] String -> String

    neg( square( {stack:[3]} ) );

    function square(r) { var e = r.stack.pop(); return { value: e*e, stack: r.stack }; } function neg(r) { r.stack.push(-r.value); return r; }

  • @javiervelezreye38

    TcnicasdeProgramacinFuncionalTallerdeProgramacinFuncionalenJavaScript

    F.TransformacinMondica

    II.TcnicasdeProgramacinFuncional

    Eldiseodefuncionesdebehacersegaran;zandolaausenciadeefectoscolateralesdemaneraquecadafuncinslodependadesusparmetrosdeentrada.Sinembargo,enelmundoreales frecuente requerir que una funcin realice operaciones que dependan del entorno(dependenciasdeestado,operacionesdeE/S,etc.).Lastcnicasdetransformacinmondicagaran;zanlaausenciadeefectoscolateralesalavezqueconservanlacapacidadcomposi;va.

    Supongamos que tenemos unalibrera de funciones matemEcasde un solo parmetro que operancon nmeros y devuelven unnmero.PormoEvosdedepuracinestas funciones emiten mensajes alaconsola

    function inv (x) { console.log('invertir'); return 1/x; } function sqr (x) { console.log('cuadrado'); return x*x; } function inc (x) { console.log('incremento'); return x+1; } function dec (x) { console.log('decremento'); return x-1; }

    Dado que la traza por consola seconsidera un efecto colateralindeseable se transforman lasfuncionesenpurasparametrizandolatrazacomovaloranexodesalida

    function inv (x) { return { value: 1/x, log: ['invertir'] }; } function sqr (x) { return { value: x*x, log: ['cuadrado'] }; } function inc (x) { return { value: x+1, log: ['incrementar'] }; } function dec (x) { return { value: x-1, log: ['decrementar'] }; }

    Ejemplo.MonadaEscritor

  • @javiervelezreye39

    TcnicasdeProgramacinFuncionalTallerdeProgramacinFuncionalenJavaScript

    F.TransformacinMondica

    II.TcnicasdeProgramacinFuncional

    Eldiseodefuncionesdebehacersegaran;zandolaausenciadeefectoscolateralesdemaneraquecadafuncinslodependadesusparmetrosdeentrada.Sinembargo,enelmundoreales frecuente requerir que una funcin realice operaciones que dependan del entorno(dependenciasdeestado,operacionesdeE/S,etc.).Lastcnicasdetransformacinmondicagaran;zanlaausenciadeefectoscolateralesalavezqueconservanlacapacidadcomposi;va.

    Ahora las funciones son puras pero han perdido sucapacidad composiEva puesto que incumplen laregla de compaEbilidad Rango-Dominio. Esnecesario, en primer lugar, crear una funcin unitque eleve valores unitarios desde el Epo simple(Number)alEpomondico(valor+log)

    Ahora podemos crear una funcin bind que permita componernuestras funciones anteriores sin necesidad de alterarlas. Estafuncin recibeun valormondico (entrada+ logacumulado) yunadenuestrasfunciones.Lafuncinbindprimerodesenvuelvelamonada,despusaplicalafuncinpasadacomoparmetroyanexa la traza de la misma al log acumulado. Finalmentedevuelvelaestructuramondicaconlosresultadosobtenidos

    function unit (value) { return { value: value, log : [] }; }

    Ejemplo.MonadaEscritor

    function bind (m, fn) { var r = fn(m.value); return { value : r.value, log : m.log.concat(r.log) }; return this; }

  • @javiervelezreye40

    TcnicasdeProgramacinFuncionalTallerdeProgramacinFuncionalenJavaScript

    F.TransformacinMondica

    II.TcnicasdeProgramacinFuncional

    Eldiseodefuncionesdebehacersegaran;zandolaausenciadeefectoscolateralesdemaneraquecadafuncinslodependadesusparmetrosdeentrada.Sinembargo,enelmundoreales frecuente requerir que una funcin realice operaciones que dependan del entorno(dependenciasdeestado,operacionesdeE/S,etc.).Lastcnicasdetransformacinmondicagaran;zanlaausenciadeefectoscolateralesalavezqueconservanlacapacidadcomposi;va.

    Con las funciones de transformacin mondicaunit & bind hemos creado una solucin paragaranEzar la composicin funcional eliminandolosefectoscolateralesdetrazaporpantalla

    Ejemplo.MonadaEscritor

    bind( bind( unit(3), sqr ), neg );

    unit

    sqr

    inc

    3

    { value: 10, log: [ 'cuadrado', 'incremento'] }

    ElvalorprimiEvo3,setransformaprimeroalEpomondicoyluegosecomponeconlafuncinsqreincpormediodelaasistenciaqueproporcionalafuncinbind

  • @javiervelezreye41

    TcnicasdeProgramacinFuncionalTallerdeProgramacinFuncionalenJavaScript

    F.TransformacinMondica

    II.TcnicasdeProgramacinFuncional

    Eldiseodefuncionesdebehacersegaran;zandolaausenciadeefectoscolateralesdemaneraquecadafuncinslodependadesusparmetrosdeentrada.Sinembargo,enelmundoreales frecuente requerir que una funcin realice operaciones que dependan del entorno(dependenciasdeestado,operacionesdeE/S,etc.).Lastcnicasdetransformacinmondicagaran;zanlaausenciadeefectoscolateralesalavezqueconservanlacapacidadcomposi;va.

    ExistenmuchosEposdeefectoscolateralesquepuedenevitarse por medio de la aplicacin de tcnicas decomposicin mondica. Dado que cada Epo de efectocolateral requiere una lgica unit y bind especfica esbuenaideaexpresarestastcnicascomoobjetosdondeunitsecodifiquecomoconstructorybindcomomtodomiembrodelprotoEpo

    Ejemplo.MonadaEscritor

    function Writer (value) { this.value = value; this.log = []; } Writer.prototype.bind = function (fn) { var m = fn(this.value); var result = new Writer(m.value); result.log = this.log.concat(m.log); return result; };

    var r = new Writer(3) .bind(sqr) .bind(inc);

    Aunque desde un punto de vista pragmEcoesta operaEva resulta cmoda y naturaldebemosserconscientesdequeseapoyaenencapsulacindeestado

  • @javiervelezreye42

    TcnicasdeProgramacinFuncionalTallerdeProgramacinFuncionalenJavaScript

    G.InversindeControl

    II.TcnicasdeProgramacinFuncional

    Lasprogramacinfuncionalpermitear;culardos;posdearquitecturascomplementarias.Lasarquitecturascentradasenlosdatosfijanunacoleccindedatosdeentradayhacenatravesaren torno a ellos una coleccin de transformaciones funcionales. Ortogonalmente, lasarquitecturascentradasenlatransformacinestablecenunacadenacomposi;vadefuncionesqueesatravesadapordiversascoleccionesdedatos.Lastcnicasdeinversindecontrolsonunapasarelaparaconver;runesquemaarquitectnicoenelcontrarioyviceversa.

    data('La FP en JS Mola!!!') .do(clean) .do(words) .do(count);

    function data (value) { return { value: value, do: function (fn) { this.value = fn(this.value); return this; } }; }

    count words clean S 5

    ArquitecturasCentradasenlosDatos

    Lasarquitecturascentradasenlosdatosfijanunconjunto de datos y permiten realizartransformaciones pasadas como parmetros enordensuperior

  • @javiervelezreye43

    TcnicasdeProgramacinFuncionalTallerdeProgramacinFuncionalenJavaScript

    G.InversindeControl

    II.TcnicasdeProgramacinFuncional

    Lasprogramacinfuncionalpermitear;culardos;posdearquitecturascomplementarias.Lasarquitecturascentradasenlosdatosfijanunacoleccindedatosdeentradayhacenatravesaren torno a ellos una coleccin de transformaciones funcionales. Ortogonalmente, lasarquitecturascentradasenlatransformacinestablecenunacadenacomposi;vadefuncionesqueesatravesadapordiversascoleccionesdedatos.Lastcnicasdeinversindecontrolsonunapasarelaparaconver;runesquemaarquitectnicoenelcontrarioyviceversa.ArquitecturasCentradasenlaTransformacin

    Lasarquitecturascentradasenlatransformacinestablecen una cadena de composicin detransformaciones funcionales por las queatraviesandisEntascoleccionesdedatos

    clean words countS 5

    function clean (s) { return s.trim(); } function words (s) { return s.split(' '); } function count (s) { return s.length; } count( words( clean('La FP en JS Mola!!!') ) );

    En el siguiente captulo estudiaremos patronesdedicados a establecer transformaciones paraconverEr arquitecturas centradas en los datos aarquitecturas centradas en transformacin yviceversa

  • [email protected]

    [email protected]

    TallerdeProgramacinFuncionalenJavaScript

    Enero2016