Iniciando na Programação funcional.
Tags: beginners, programming, tutorial
Published: 2024-02-21 17:27:13

# O que é programação funcional

Contextualizando, Programação funcional é um paradigma de programação, ou seja uma forma de abordar a resolução de problemas no mundo da tecnologia, diferente de outros paradigmas como POO. Como o nome sugere, Programação funcional trata programação como funções matemáticas, visando evitar a criação de  estados e dados mutáveis, promovendo a ideia de `stateless` e `immutable`.

## Conceitos

#### Stateless e Immutable

###### Immutable 
  Significa que depois que um dado é criado ele **nunca** deverá ser alterado. Com isto evitamos retornos inesperados. 
###### Stateless
 Trata das funções que devem se comportar sem estado, isso significa que ela deve retornar algo como se fosse sua primeira chamada, tudo que rodou antes da função não deve ter nenhuma influência no seu retorno.
#### Regras / convenções

- Funções devem ser independentes.
- Sempre ter pelo menos um argumento: Isso ajuda a evitar dependências de estados globais.
- Funções sempre devem retornar algo.
- Dados, informações ou até outras funções: Isso promove a transparência e clareza nas operações. Não existem loops
- Loops devem ser criados através de recursividade: Isso favorece a imutabilidade e a clareza do código. Funções devem ser puras
- Não depender de nenhum dado externo: Isso garante que uma função produza o mesmo resultado para as mesmas entradas, facilitando o teste e a compreensão do código

## Funções impuras

Funções impuras nem sempre retornam o valor esperado, isso acontece quando a função tem variáveis mutáveis, permitindo a mudança de estado.  Que é o que por construção não acontece na programação funcional. 
Um exemplo de função impura:
```python
def remove_last_from_list(input):
	input.pop()
names = ['Lucas', 'Tsugami', 'Rafa']
print(names) #Output: ['Lucas', 'Tsugami']
remove_last_from_list(names)
print(names) #Output: ['Lucas']
     
```

##  Diferenças de Imperativo e POO

#### Imperativo
No paradigma imperativo, a ideia está na execução de instruções que modificam o estado do programa ao longo da sua execução, com variáveis mutáveis por exemplo. A estrutura do código é baseado em procedimentos e funções, com ênfase em "como" as operações são realizadas, detalhando passos específicos a serem seguidos. 

#### Programação orientada a Objetos(POO)
No POO a abordagem é centrada a objetos que encapsulam dados e comportamentos relacionados. Esses objetos interagem entre si, proporcionando uma organização modular do código. 

## Exemplos 

Aqui vou usar Python para mostrar um exemplo de como é este paradigma na pratica. Vou usar um exemplo no paradigma Imperativo e um Funcional, visto que o POO pode ser 'aproveitado' e utilizado na programação funcional. 

```python
##Imperativo
number_list = [1,2,3,4,5,6]
sum_pairs = 0
for num in number_list:
	if num %2 ==0:
		square = num **2
		sum_square += square
print(sum_square) #Output:56

```
Note que é necessário usar de um `loop for` para percorrer a lista de números e conseguir o resultado. Ou seja, a cada iteração é gerado um novo estado.

```python
##Funcinoal
number_list = [1,2,3,4,5,6]
sum_pairs = sum(map(lambda x: x**2, filter(lambda x: x % 2==0, number_list)))
print(sum_pairs) #Output: 56

```

Neste exemplo funcional utilizamos expressões `map`, `lambda` e `filter` para criar uma lista de números pares e em seguida a função `sum` para conseguir a soma total. Este exemplo é mais conciso e expressa uma operação de forma funcional, evitando estados mutáveis.

## Vantagens da programação funcional

##### Suporte a debug e testes

A Programação Funcional proporciona um suporte melhor a debug e testes devido à imutabilidade e à pureza das funções. Isso facilita a identificação e correção de erros, tornando o desenvolvimento mais robusto.

##### Performance de código

A abordagem funcional contribui para a melhoria da performance do código em situações em que a imutabilidade e a ausência de efeitos colaterais são críticas. Isso é particularmente útil em sistemas que exigem alta confiabilidade e escalabilidade.

##### Expressividade e concisão

A programação funcional permite a expressão concisa de lógicas complexas, tornando o código mais legível e fácil de entender. Essa característica é valorizada em projetos que demandam manutenção a longo prazo e colaboração entre desenvolvedores.

## Linguagens de programação funcionais. 

### Elixir

O maior diferencial do Elixir é o polimorfismo, permitindo a criação de funções com diferentes implementações para tipos distintos de dados.

### Haskell

Haskell é uma linguagem funcional pura que se destaca pela forte tipagem, inferência de tipos e imutabilidade. Sua sintaxe concisa e expressiva é favorecida em ambientes acadêmicos e aplicações matemáticas.

### Scala

Scala é uma linguagem híbrida, incorporando conceitos funcionais e orientados a objetos. Oferece flexibilidade na transição de códigos imperativos para funcionais, sendo amplamente utilizada em ambientes corporativos.