Conceitos de linguagens funcionais: o que é currying? \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 16 Horas 

 42 Min 

 10 Seg 

   Tempo restante da oferta: 16 42 10 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) Conceitos de linguagens funcionais: o que é currying?  [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) [ Programação funcional ](https://www.treinaweb.com.br/blog/categoria/programacao-funcional) 

# Conceitos de linguagens funcionais: o que é currying?

 O paradigma funcional vem ficando a cada dia mais popular entre os desenvolvedores. Porém, com este paradigma, uma série de novos termos que parecem confusos e complexos estão aparecendo. Um destes termos é o "currying". Neste artigo, vamos responder à pergunta: o que é currying?

 [ Cleber Campomori ](https://www.treinaweb.com.br/blog/autor/cleber-campomori) 8 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/04/08160716/capa-currying.jpg)  

O paradigma funcional e suas vertentes vêm ganhando cada vez mais destaque no mercado de maneira geral. Os benefícios das linguagens funcionais que vimos [neste artigo](https://www.treinaweb.com.br/blog/o-que-sao-as-linguagens-funcionais/ "neste artigo") justificam essa adoção mais intensa de soluções e linguagens que suportem este paradigma por parte do mercado. Porém, junto com esta popularização, começam a surgir uma variedade de termos que antes eram incomuns e soam como algo extremamente complexo, como *currying*, *pattern matching* e *monads*, por exemplo. E, por muitas vezes, estes termos acabam por assustar quem está tendo os primeiros contatos com o mundo do paradigma funcional. Nesta série de artigos, vamos começar a ilustrar alguns destes termos esquisitos. Iremos iniciar falando um pouco sobre *currying*.

[  ![HTML5 + CSS3 - Fundamentos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/html5-css3.svg)   Curso HTML5 + CSS3 - Fundamentos Conhecer o curso ](https://www.treinaweb.com.br/curso/html5-css3-fundamentos)

#### Antes de tudo: quem foi Haskell Curry?

Toda essa história começa com um matemático norte-americano: **Haskell Curry**. Haskell inicialmente iniciou seus estudos superiores em medicina na Universidade de Harvard em 1916, mas decidiu estudar matemática no meio do caminho. Ainda trabalhou no campo de engenharia elétrica no MIT e logo após retornou à Harvard para obter uma pós-graduação em Física. Logo após, ainda obteve o título de *Ph.D.* na área de lógica combinatória, também pela Universidade de Harvard. Curry ainda trabalhou no projeto ENIAC (o primeiro computador digital do mundo) após a Segunda Guerra Mundial.

[![Haskell Curry (Gleb.svechnikov &#91;CC BY-SA 4.0 (https://creativecommons.org/licenses/by-sa/4.0)&#93;)](https://i.loli.net/2019/03/30/5c9e4fbbb92a6.jpg "Haskell Curry (Gleb.svechnikov &#91;CC BY-SA 4.0 (https://creativecommons.org/licenses/by-sa/4.0)&#93;)")](https://i.loli.net/2019/03/30/5c9e4fbbb92a6.jpg "Haskell Curry (Gleb.svechnikov &#91;CC BY-SA 4.0 (https://creativecommons.org/licenses/by-sa/4.0)&#93;)")

*A foto acima pertence a Gleb.svechnikov (CC BY-SA 4.0 (https://creativecommons.org/licenses/by-sa/4.0))*

Curry fez um trabalho fantástico na área de lógica combinatória, área esta que era sua grande paixão. Seu trabalho matemático envolvendo lógica e análise combinatória inspirou e norteou uma série de princípios na área da computação, principalmente no que diz respeito justamente ao paradigma funcional e no cálculo-lambda (uma das bases do paradigma funcional). Além disso, Curry fundamentou um conceito importantíssimo para o paradigma funcional, conceito este que, em sua homenagem, recebeu seu sobrenome: **currying**. Ainda temos uma outra homenagem a Curry: a famosa linguagem funcional *Haskell*, que recebeu esse nome em homenagem ao matemático precursor dos conceitos de programação funcional.

#### O que é o currying em linguagens funcionais?

A definição clássica de *currying* diz o seguinte:

> Dada uma função f do tipo `f: (X x Y) → Z`, a técnica de *currying* pode transformar a expressão em `curry(f): → (Y → Z)`

Calma! Não se desespere com a notação matemática. Ela é mais simples do que parece. :) Vamos relembrar um conceito importante sobre funções matemáticas: elas não podem receber mais do que um parâmetro. Por definição, funções matemáticas só recebem um único parâmetro por vez. Se levarmos esta situação para o ambiente de programação, criar métodos que recebem um único parâmetro por vez pode ser um complicador. Mas, se quisermos seguir o paradigma funcional, precisamos tentar seguir estas regras… Como podemos criar funções que recebam um único parâmetro por vez? Como poderíamos, por exemplo, criar uma função para multiplicar dois números recebendo um único parâmetro? Vamos adotar o JavaScript para ilustrar esta situação. Se fôssemos escrever essa função de maneira “normal”, poderíamos ter o seguinte código:

```javascript
function multiplicar(n1, n2) {
	return n1 * n2;
}
// ...
console.log(multiplicar(2, 2)); // A saída deverá ser "4"

```

Nossa função está recebendo dois parâmetros, e precisamos que ela receba um único parâmetro. Nós podemos obter esse resultado se montarmos uma composição de funções: podemos ter a primeira função recebendo `n1`, sendo que esta função retorna uma outra função que recebe `n2`! Nosso código poderia ficar da seguinte maneira:

```javascript
function multiplicar(n1) {
	return function(n2) {
		return n1 * n2;
	}
}
// ...
const funcaoCurrying = multiplicar(2);
console.log(funcaoCurrying(2)); // A saída deverá ser "4"
// OU...
console.log(multiplicar(2)(2)); // A saída deverá ser "4"

```

Veja que temos funções que recebem um único parâmetro por vez, e estas funções podem retornar outras funções, formando uma cadeia de composição de funções. É exatamente o que a notação `curry(f): → (Y → Z)` na notação matemática que vimos no começo deste bloco diz: nós podemos ter uma função chamada `curry` gerada pelo encadeamento das funções `Y` e `Z`. No final, todas essas funções são funções que chamamos de “unárias”, pois elas lidam somente com um único parâmetro por vez. O código acima ficaria muito mais elegante se utilizássemos *arrow functions* (ou funções-lambda):

```javascript
const multiplicar = (n1) => (n2) => n1 * n2;
// ...
console.log(multiplicar(2)(2)); // A saída deverá ser "4"

```

Com o trecho acima, temos um código simples, elegante, funcional e utilizando a técnica de *currying*! ;)

[  ![Python - Fundamentos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/python.svg)   Curso Python - Fundamentos Conhecer o curso ](https://www.treinaweb.com.br/curso/python-fundamentos)

#### Quais as vantagens obtidas através da utilização do *currying*?

Para mim, particularmente, nós temos uma série de vantagens interessantes com o *currying*:

- *Reaproveitamento de código*. Utilizando *currying*, podemos criar uma série de funções genéricas que, quando combinadas, podem chegar à funcionalidade que desejamos, aplicando-se o conceito clássico de *composição* com maestria;
- *Criação de métodos que podem receber múltiplos parâmetros de maneira “emulada” em linguagens puramente funcionais*: algumas linguagens funcionais deixam o conceito de *currying* implícito: basta você criar uma função que receba mais de um parâmetro que, internamente, ela será decomposta para múltiplas funções aplicando-se a técnica de *currying*. Porém, outras linguagens, como o Haskell, não aceitam essa abordagem de nenhuma maneira. Estas linguagens são conhecidas como *linguagens puramente funcionais* ou *linguagens funcionais puras*. Nestes casos, se quisermos criar métodos que recebam mais do que um parâmetro (o que é bem comum), nós precisaremos recorrer ao *currying* inevitavelmente;
- *A utilização do currying produz código elegante e conciso, mesmo em linguagens não funcionais*. *Currying* não é um conceito que é aplicável somente em linguagens funcionais. Você pode aplicar a técnica de *currying* em linguagens que não são majoritariamente funcionais, como Java e C#, produzindo código legível e de fácil manutenção em praticamente qualquer linguagem;
- *No final, temos funções unárias*. Funções unárias - as funções que recebem um único parâmetro - são mais legíveis e mais fáceis de serem manuteídas, pois geralmente são menores e possuem menos pontos de entrada (já que possuem um único parâmetro), o que reduz os possíveis pontos de efeito colateral durante uma alteração no código;
- *Você provavelmente já utiliza a técnica de currying*. Se você analisar as APIs de *map/reduce/filter* do JavaScript, o LINQ do C# ou a *stream API* do Java, você verá que as APIs já trabalham com o conceito de funções que recebem um único parâmetro, ou mesmo funções que recebem funções como argumentos. Boa parte dos métodos destas APIs já utiliza conceitos de linguagens funcionais ,como o *currying*. Estas APIs só conseguem ser tão genéricas justamente por causa desse conceito de *composição de funções* que é natural ao conceito de *currying*.

#### Ainda temos muitos outros termos para vermos!

A programação funcional é de fato um mundo cheio de termos e jargões que podem soar esquisitos no início, mas que geralmente são mais simples do que parecem (como o conceito de *currying*). Ainda temos vários outros termos para serem explorados, como *monads* e *partial function applications*. Nos próximos posts, iremos continuar a desbravar estes termos esquisitos e que colocam medo por várias vezes em nós; mas que, no final, são mais simples do que parecem. Até o próximo post! ;)

- [ #Programação Funcional ](https://www.treinaweb.com.br/blog/tag/programacao-funcional)
- [ #Currying ](https://www.treinaweb.com.br/blog/tag/currying)
- [ #Programação ](https://www.treinaweb.com.br/blog/tag/programacao)

Autor

 ![Cleber Campomori](//secure.gravatar.com/avatar/c659c6a58478cad5b7751370ba94205f?d=mm)

## Cleber Campomori

 Líder de Conteúdo/Inovação. Pós-graduado em Projeto e Desenvolvimento de Aplicações Web. Certificado Microsoft MCSD (Web). 

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/cleber-campomori)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/04/08160716/capa-currying-400x280.jpg)  [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) 

     8 anos atrás

    ##  [ Conceitos de linguagens funcionais: uma breve introdução aos monads ](https://www.treinaweb.com.br/blog/conceitos-de-linguagens-funcionais-uma-breve-introducao-aos-monads) 

     Neste post, dando continuidade à série sobre programação funcional, trataremos de um tema muito pertinente: os monads e suas definições essenciais.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/02/08161105/capa-artigo-fp-400x280.jpg)  [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) 

     8 anos atrás

    ##  [ O que são as linguagens funcionais? ](https://www.treinaweb.com.br/blog/o-que-sao-as-linguagens-funcionais) 

     Ultimamente, muito temos ouvido sobre o paradigma funcional, bem como as linguagens funcionais. Mas o que tem feito este paradigma e as linguagens baseadas ficarem tão populares nos últimos anos? O que vem a ser o paradigma funcional?

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/10/03234313/kotlin-400x280.jpg)  [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) 

     7 anos atrás

    ##  [ É possível usar Kotlin no back-end? ](https://www.treinaweb.com.br/blog/e-possivel-usar-kotlin-no-back-end) 

     Confira neste artigo o Kotlin, a linguagem de programação da JetBrains e da Google que é considerada a segunda linguagem mais amada e vêm ganhando mais mercado a cada ano.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/01/12140601/carreira-de-desenvolvedor-de-aplicativos-como-comecar-400x280.png)  [ Desenvolvimento Mobile ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-mobile) 

     9 anos atrás

    ##  [ Carreira de desenvolvedor de aplicativos: como começar ](https://www.treinaweb.com.br/blog/carreira-de-desenvolvedor-de-aplicativos-como-comecar) 

     Saiba como se tornar um desenvolvedor de aplicativos reconhecido pelo mercado.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/typescript-400x280.png)  [ Javascript ](https://www.treinaweb.com.br/blog/categoria/javascript) 

     10 anos atrás

    ##  [ Precisamos falar sobre o TypeScript ](https://www.treinaweb.com.br/blog/precisamos-falar-sobre-o-typescript) 

     O TypeScript é um caso interessante. Ou você o adora ou o odeia. Parece não haver um consenso intermediário de maneira geral na comunidade. Vamos conversar um pouco sobre?

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2017/08/java-csharp-ou-php-qual-linguagem-escolher-400x280.jpg)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     9 anos atrás

    ##  [ Java, C# ou PHP: qual linguagem escolher? ](https://www.treinaweb.com.br/blog/java-csharp-ou-php-qual-linguagem-escolher) 

     Qual linguagem escolher? Java, C# ou PHP? Quais são as vantagens de cada uma? Vamos analisar estas dúvidas que são comuns para quem está começando.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/arquitetura-software-400x280.jpg)  [ Arquitetura de Software ](https://www.treinaweb.com.br/blog/categoria/arquitetura-de-software) 

     10 anos atrás

    ##  [ Por que a arquitetura do meu software deu errado? ](https://www.treinaweb.com.br/blog/por-que-a-arquitetura-do-meu-software-deu-errado) 

     Alguns desenvolvedores dão somente muita atenção à codificação. Vejamos outros importantes aspectos que precisam ser levados em consideração.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/functional-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     10 anos atrás

    ##  [ Imutabilidade de objetos no PHP ](https://www.treinaweb.com.br/blog/imutabilidade-de-objetos-no-php) 

     Imutabilidade é uma característica forte nas linguagens funcionais, onde a alteração de estado não é frequente e, quando ela acontece, é controlada. Veja como podemos ter objetos imutáveis no PHP.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/a6GH8712a1-400x280.jpg)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     10 anos atrás

    ##  [ O PHP e o seu ecossistema nunca estiveram tão fortes ](https://www.treinaweb.com.br/blog/o-php-e-o-seu-ecossistema-nunca-estiveram-tao-fortes) 

     O PHP nunca esteve tão forte. Nesse artigo, algumas desconstruções de famosas falácias acerca do PHP e alguns pontos que o fazem ser uma completa plataforma para a Web.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/linguagens-paradigmas-400x280.jpg)  [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) 

     10 anos atrás

    ##  [ Linguagens e paradigmas de programação ](https://www.treinaweb.com.br/blog/linguagens-e-paradigmas-de-programacao) 

     Saiba um pouco mais sobre as linguagens de programação e seus principais paradigmas.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/12/27115657/tendências-2020-400x280.png)  [ Tecnologia ](https://www.treinaweb.com.br/blog/categoria/tecnologia) 

     7 anos atrás

    ##  [ Tendências de TI para 2020 ](https://www.treinaweb.com.br/blog/tendencias-de-ti-para-2020) 

     Nós já estamos praticamente no ano de 2020. Por isso, nada melhor do que iniciar o próximo ano já por dentro das mais fortes tendências dentro da área de tecnologia. Neste artigo, vamos abordar cinco conceitos, linguagens ou habilidades que, em nossa opinião, estarão em evidência no mercado de trabalho.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/tostring-400x280.jpg)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     10 anos atrás

    ##  [ Para que servem os métodos ToString(), Equals() e GetHashCode()? ](https://www.treinaweb.com.br/blog/para-que-servem-os-metodos-tostring-equals-e-gethashcode) 

     Neste artigo vamos entender como funcionam e para que servem os métodos ToString(), Equals() e GetHashCode() em linguagens baseadas no .NET e no Java.

     Ler artigo

## Um ano de acesso total para você viver de programação.

 Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro `console.log` ao mercado de trabalho.

- **1 ano** de acesso a **todos os cursos**
- Cursos novos **toda semana**
- Suporte **direto com professores**
- Plano de carreira **personalizado**
- **Certificados digitais** inclusos
- **Aplicativos** para Android e iOS, com **acesso offline**

    **Garantia incondicional de satisfação** 

 Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

### Acesso completo a todos os cursos e dezenas de Formações.

 12 meses 

  Economize R$ 840,00  54% OFF 

 de 12x R$ 129,00 por apenas

 12x  R$ 59,00

 sem juros no cartão de crédito ou R$ 599,00 à vista

  Oferta termina em  **16h 42min 10s**

- Acesso imediato e ilimitado durante 1 ano.
- Plano de carreira personalizado.
- Suporte direto com professores.
- E muito mais!

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
