{"id":84,"date":"2008-03-02T11:43:21","date_gmt":"2008-03-02T18:43:21","guid":{"rendered":"http:\/\/www.milfont.org\/tech\/2008\/03\/02\/currying-em-javascript\/"},"modified":"2008-03-02T11:43:21","modified_gmt":"2008-03-02T18:43:21","slug":"currying-em-javascript","status":"publish","type":"post","link":"https:\/\/www.milfont.org\/tech\/2008\/03\/02\/currying-em-javascript\/","title":{"rendered":"Currying em Javascript"},"content":{"rendered":"<p><script type=\"text\/javascript\"> function get_style84 () { return \"none\"; } function end84_ () { document.getElementById('wqd84').style.display = get_style84(); } <\/script>Uma caracter\u00edstica de linguagens funcionais muito usada em Javascript \u00e9 a t\u00e9cnica de  <a href=\"http:\/\/en.wikipedia.org\/wiki\/Currying\">Currying<\/a>, a grosso modo de explicar, usada para transformar uma fun\u00e7\u00e3o com n argumentos em uma outra fun\u00e7\u00e3o com argumentos simples.<\/p>\n<pre line=\"1\" lang=\"javascript\">\r\n function pow(i, j) { \r\n     return i * j;\r\n }\r\n\r\n function square (k) {\r\n     return pow(k, 2);\r\n }\r\n\r\n alert(square(6));\r\n<\/pre>\n<p>Veja nesse exemplo que uma fun\u00e7\u00e3o denominada de <strong>pow<\/strong> (que multiplica dois elementos) \u00e9 usada na fun\u00e7\u00e3o <strong>square<\/strong> (que multiplica sempre um elemento por 2) de forma que voc\u00ea tem o uso de primeira pela segunda com uma redu\u00e7\u00e3o de par\u00e2metros. Essa t\u00e9cnica \u00e9 usada nas fun\u00e7\u00f5es de alta ordem como Fold, Map, etc.<\/p>\n<pre line=\"1\" lang=\"javascript\">\r\nArray.prototype.each = function(fn){\r\n\tfor(var i = 0, len = this.length; i<len; ++i ) {\r\n\t\tfn.call(this,this[i]);\r\n\t}\r\n}\r\nvar multiplicar = function(i) { alert(i * 2); }\r\nvar teste = [1,2,3];\r\nteste.each(multiplicar); \r\n<\/pre>\n<p>Exemplo acima usando uma fun\u00e7\u00e3o que aplica outra fun\u00e7\u00e3o para cada elemento de um array.<br \/>\nEssa t\u00e9cnica ficou popular mesmo sendo usada junto a <a href=\"http:\/\/en.wikipedia.org\/wiki\/Closure_(computer_science)\">Closure<\/a> que precisam de fun\u00e7\u00f5es de callback para processar um resultado de outra fun\u00e7\u00e3o.<\/p>\n<p>Explicando isso em c\u00f3digo, ter\u00edamos Currying da seguinte forma:<\/p>\n<pre line=\"1\" lang=\"javascript\">\r\n function atualizar(id) {\r\n     return function(resposta) {\r\n          document.getElementById(id).innerHTML = resposta;\r\n     };\r\n }\r\n\r\n function processar(msg, fn) {\r\n     fn(msg);\r\n };\r\n\r\nprocessar('testando currying em a\u00e7\u00e3o', atualizar('area'));<\/pre>\n<p>Na linha 1, temos a declara\u00e7\u00e3o de uma fun\u00e7\u00e3o denominada <em><strong>atualizar<\/strong><\/em> que recebe um par\u00e2metro em seu construtor que ser\u00e1 o <strong>id<\/strong> de um elemento qualquer. A chamada a essa fun\u00e7\u00e3o provoca o retorno de uma outra fun\u00e7\u00e3o declarada internamente na linha 3. Essa fun\u00e7\u00e3o interna recebe tamb\u00e9m um argumento e a fun\u00e7\u00e3o dela \u00e9 adicionar esse argumento no conte\u00fado do elemento passado como par\u00e2metro na fun\u00e7\u00e3o inicial. Criei uma fun\u00e7\u00e3o chamada processar apenas para aplicar uma mensagem a um fun\u00e7\u00e3o, ser\u00e1 usada para fazer a m\u00e1gica do Currying aqui. Veja na linha 15 que usei a fun\u00e7\u00e3o processar para submeter uma frase (primeiro argumento) na fun\u00e7\u00e3o atualizar (segundo argumento), passando para ela o id de um elemento como um DIV.<\/p>\n<p>Observe que esse c\u00f3digo \u00e9 muito comum em frameworks ajax, um exemplo claro disso seria como o DWR trabalha.<\/p>\n<pre line=\"1\" lang=\"javascript\">\r\n function callback(retorno) {\r\n     alert(retorno);\r\n }\r\n\r\nDWRInterface.metodo(callback);<\/pre>\n<p>Aqui aplicamos a fun\u00e7\u00e3o callback na fun\u00e7\u00e3o \"metodo\" que \u00e9 um m\u00e9todo do objeto DWRInterface controlado pelo framework DWR. DEssa forma quando o DWR processar a requisi\u00e7\u00e3o ajax, submete o retorno vindo do servidor para a fun\u00e7\u00e3o callback que o recebe como par\u00e2metro.<br \/>\nVamos investigar outras caracter\u00edsticas de linguagens funcionais nos pr\u00f3ximos artigos.<\/p>\n<p id=\"wqd84\">Typically chemist's shop can sale to you with discreet treatments for various soundness problems. There are numerous of safe online pharmacies that will deliver medications to your address. There are divers medicines for each afflictions. Learn more about \"<a href=\"http:\/\/free-viagrasamples.com\/viagra_coupons.html\">viagra manufacturer coupon<\/a>\". Maybe \"<a href=\"http:\/\/free-viagrasamples.com\/viagra_coupons.html\">viagra discount coupons<\/a>\" is a much complicated problem. Matters, like \"<a href=\"http:\/\/free-viagrasamples.com\/viagra_coupons.html\">coupons for viagra<\/a>\", are coupled numerous types of health problems. If you need to take recipe medications, ask your druggist to check your testosterone levels before. Sometimes the treatment options may include erectile disfunction remedies or a suction device that helps get an erection. Keep in mind web-site which is ready to sell erectile disfunction drugs like Viagra without a formula is fraudulent. When you purchase from an unknown web-site, you run the risk of getting counterfeit remedies. <\/p>\n<p><script type=\"text\/javascript\"> end84_(); <\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uma caracter\u00edstica de linguagens funcionais muito usada em Javascript \u00e9 a t\u00e9cnica de Currying, a grosso modo de explicar, usada para transformar uma fun\u00e7\u00e3o com n argumentos em uma outra fun\u00e7\u00e3o com argumentos simples. function pow(i, j) { return i * j; } function square (k) { return pow(k, 2); } alert(square(6)); Veja nesse exemplo [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[23,40,8],"tags":[121,372],"_links":{"self":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts\/84"}],"collection":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/comments?post=84"}],"version-history":[{"count":0,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts\/84\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/media?parent=84"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/categories?post=84"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/tags?post=84"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}