O que são as linguagens funcionais? \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 19 Horas 

 55 Min 

 37 Seg 

   Tempo restante da oferta: 19 55 37 

  [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) O que são as linguagens funcionais?  [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) 

# O que são 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?

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

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/02/08161105/capa-artigo-fp.jpg)  

Ultimamente, as linguagens ditas *funcionais* estão ganhando cada vez mais a atenção dos desenvolvedores em geral. Já não é tão difícil encontrarmos projetos que utilizem uma linguagem funcional para resolver problemas que envolvem principalmente paralelismo e/ou processamento de quantidades grandes de dados. As ideias fundamentadas pelo *paradigma funcional* dão essa “vocação” para o paralelismo e processamento de quantidades extensas de dados para estas linguagens ditas funcionais. Mas, no final das contas, o que torna as linguagens funcionais tão adequadas para a resolução destes tipos de problemas? E quais são os contrapontos entre o paradigma funcional e o paradigma [orientado a objetos](https://www.treinaweb.com.br/blog/os-pilares-da-orientacao-a-objetos/ "orientado a objetos")? Será que o paradigma funcional pode substituir completamente o paradigma orientado a objetos?

### O que é o paradigma funcional?

Antes de qualquer coisa: não, o paradigma funcional não tem esse nome porque *ele funciona*.

![Meme Carlos alberto - praça é nossa](https://i.loli.net/2019/02/22/5c6f9656b03ad.png)

O paradigma funcional possui esse nome porque ele está fortemente fundamentado nos conceitos das **funções matemáticas**. Mas calma! Muita gente já “torce o nariz” ao ouvir falar de matemática, mas os conceitos envolvidos na descrição do paradigma funcional podem ser mais tranquilos de se entender do que você imagina.

### Relembrando alguns conceitos de funções matemáticas

Vamos recapitular um pouco sobre uma função matemática. Uma função matemática tem essa aparência:

![exemplo função matemática](https://i.loli.net/2019/02/22/5c6fde0078f04.png)

Se verificarmos, uma função matemática possui uma **única entrada**. Em uma função matemática, essa única entrada **sofre um tipo de processamento**, processamento este que retorna uma **saída de qualquer maneira**. No caso da função acima:

- A entrada é definida por `x`;
- O processamento é a elevação de `x` ao quadrado mais `3`;
- A saída é o resultado do processamento descrito acima.

Mais um exemplo: se entrarmos com o número `2` nessa função matemática, teremos a saída `7`, pois `2^2 (4) + 3` é igual a `7`.

![exemplo função matemática](https://i.loli.net/2019/02/22/5c6fdfc9330cc.png)

Existem alguns detalhes importantes. A função acima, além de sempre retornar um resultado compulsoriamente, ela sempre retornará a mesma saída para uma determinada entrada. Por exemplo: podemos “chamar” esta função passando para ela a entrada `2` hoje, amanhã ou daqui 10 anos… Não importa: o resultado dela sempre será `7`, independente da situação. Nós chamamos esta característica de **determinismo**. Por isso, dizemos que funções matemáticas em sua essência são **determinísticas**. Outro fato interessante: **funções matemáticas não possuem o conceito de escopo**. Isso quer dizer que a entrada é processada e a saída correspondente é devolvida imediatamente. Não existem “variáveis” intermediárias que só podem ser acessadas dentro da função matemática: só existe a entrada e a saída.

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

### Trazendo conceitos de funções matemáticas para as linguagens de programação

O paradigma funcional se baseia fortemente nos conceitos de funções matemáticas que discutimos no tópico anterior. E, sendo um paradigma, não necessariamente precisa ser implementado com uma linguagem funcional… Por exemplo, poderíamos reescrever a função matemática anterior com o seguinte código Java:

```java
public int doFunction(int x){
    return (x * x) + 3;
}

System.out.println(doFunction(2)); // A saída será "7"!

```

Veja que, na função acima:

- Temos uma única entrada;
- Não existe o conceito de escopo, pelo menos não explicitamente (já que não existem variáveis criadas dentro do método `doFunction()`);
- O método **sempre** irá produzir uma saída;
- O método é **determinístico**, pois ele irá sempre produzir a mesma saída para uma mesma entrada.

Sendo assim, conseguimos criar um código funcional, mesmo utilizando o Java, que não é uma linguagem essencialmente funcional. Acima, ainda temos uma outra característica intrínseca ao paradigma funcional que é fantástica: a **imutabilidade**! Veja que, em nossa versão Java da função matemática, a entrada nunca é modificada: ela simplesmente sofre um processamento, produzindo uma saída. A saída produzida também nunca é modificada… Isso é fantástico, pois ao final, estamos quase que trabalhando com constantes o tempo inteiro. Obviamente, o Java e outras linguagens majoritariamente orientadas a objeto não dão um suporte 100% para estes conceitos que descrevemos… Porém, se pegarmos linguagens majoritariamente funcionais, nós teremos estes princípios básicos levados mais à risca. Por exemplo: vamos considerar a reescrita desta função em F#, uma linguagen funcional:

```fsharp
let doFunction x = (x * x) + 3

let result = doFunction 2
printfn "Resultado: %i" result

```

Acima, temos a mesma função reescrita em uma linguagen funcional. Veja que os conceitos de ausência de escopo, massa de entrada e saída e determinismo são respeitados aqui. Aliás, se você tentar modificar a “variável” `result` (que aqui é chamada de *binding*), o compilador irá produzir um erro.

### Por que linguagens funcionais podem ser interessantes para paralelismo, assincronia e processamento de grandes quantidades de informações?

Nós estamos, em maioria, acostumados a escrever código *orientado a objetos*, e uma das premissas da orientação a objetos é a *transição de estado*: nós criamos variáveis e/ou objetos que mudam de conteúdo o tempo inteiro, fazendo com que o nosso código tome decisões em cima destas flutuações de estado que acontecem. Isso não existe dentro do paradigma funcional, tendo em vista o determinismo e a imutabilidade. Quando estamos falando sobre o processamento de quantidades muito grandes de dados, tornar esse processamento assíncrono e paralelo é essencial. E isso pode se tornar um problema muito complicado quando falamos de transição de estado neste cenário. Um exemplo simples: quando criamos *threads*, uma *thread* não pode acessar o conteúdo que está sendo processado por outra *thread*. Quando precisamos que *threads* por alguma razão compartilhem alguma varíavel, nós acabamos precisando recorrer a patterns (como o famigerado *singleton* ). E no final, nós ainda precisamos nos preocupar em garantir que a modificação destes recursos compartilhados não irá ocorrer de maneira concorrente, com uma *thread* sobrescrevendo ou passando por cima do resultado de uma outra *thread* ao mesmo tempo. Para isso, precisamos recorrer a recursos como *semáforos* e *monitores*. Veja que, somente por termos um código baseado em transições de estados, nós precisamos recorrer a uma certa complexidade de código para garantir que tudo ocorra bem. Logicamente isso é factível, mas é extremamente trabalhoso. Linguagens funcionais não possuem estes problemas, pois elas já trabalham com imutabilidade e determinismo nativamente. Imutabilidade e determinismo são pilares do paradigma funcional. Se não existem transições de estado, nós não teríamos este tipo de problema se utilizássemos uma linguagem funcional.

[  ![C# (C Sharp) Básico](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/csharp.svg)   Curso C# (C Sharp) Básico Conhecer o curso ](https://www.treinaweb.com.br/curso/csharp-basico)

### Então devo chutar a orientação a objetos e aprender somente o paradigma funcional?

![foto de um urso desolado](https://i.loli.net/2019/02/22/5c6febc5ef33d.jpg)

**Não! Não faça isso!**O paradigma funcional também possui seus problemas… A curva de aprendizado tende a ser ligeiramente maior do que a curva do paradigma orientado a objetos, principalmente porque muitas pessoas já criam um “bloqueio” pela associação à matemática. Existem também alguns conceitos dentro do paradigma funcional que não são tão “naturais” de serem entendidos, como *currying* e *monads*. Sendo assim, a curva de aprendizado tende a ser um pouquinho mais íngreme. Também temos o fato de que pouca coisa no mundo real é determinística: estamos falando das típicas situações de I/O. O acesso a uma tabela de um banco de dados, por exemplo, não pode ser determinístico: nós podemos tanto conseguir acessar a tabela como podemos em algum momento ter uma queda de conexão… Logicamente, as linguagens funcionais modernas são preparadas para também lidar com situações não-determinísticas, mas cada uma delas pode tratar de maneira diferente, o que contribui para aumentar um pouco mais o processo de aprendizagem e aplicação correta em situações do dia-a-dia. Existe também a questão de legibilidade do código. Eu particularmente observo que é mais fácil produzir código ilegível em linguagens funcionais do que em linguagens orientadas a objeto. Tudo bem, um desenvolvedor iniciante (ou um desenvolvedor infelizmente ruim) irá produzir código ruim de qualquer maneira… Mas observo que as linguagens funcionais dão uma “forcinha” a mais nesse sentido por diferentes fatores: sintaxe propriamente dita das linguagens que implementam este paradigma, a maior ocorrência da não-observância dos pilares funcionais, entre outros. Por isso, pelo menos para mim, o ideal é: **aprenda e domine os dois paradigmas**. Ambos serão muito úteis, dependendo-se da situação. Precisa criar uma página de cadastro de algo? Provavelmente a orientação a objetos pode ser mais aplicável… Precisa gerar um CSV a partir de um conjunto grande de dados? Provavelmente uma linguagem ou até mesmo uma abordagem funcional será mais aplicável. Aqui vale o velho mantra: **não existe bala de prata no mundo de desenvolvimento de software**. Aprenda os dois paradigmas e seja feliz!

[  ![Desenvolvedor C#](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/c-sharp.svg)   Formação Desenvolvedor C# Conhecer a formação ](https://www.treinaweb.com.br/formacao/desenvolvedor-c)

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

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: o que é currying? ](https://www.treinaweb.com.br/blog/conceitos-de-linguagens-funcionais-o-que-e-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?

     Ler artigo
- ![](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/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/2020/10/o-que-e-f-f-sharp-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     6 anos atrás

    ##  [ O que é F# (F Sharp)? ](https://www.treinaweb.com.br/blog/o-que-e-f-f-sharp) 

     Veja neste artigo o que é a Linguagem de Programação F# (F Sharp).

     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/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/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/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/1970/01/17204640/como-comecar-com-php-400x280.jpg)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     9 anos atrás

    ##  [ Como começar com PHP? ](https://www.treinaweb.com.br/blog/como-comecar-com-php) 

     Quer iniciar seus estudos em PHP e não sabe por onde começar? Veja o que preparamos pra você.

     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

## 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  **19h 55min 37s**

- 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
