October DealsAmazon USOctober deal check: compare before you payAmazon US: current deals, useful picks and tech finds.Check DealsWindows FixRecommendedWindows errors stealing your time? Find the fix fastScan stability, cleanup and performance issues.Fix NowOctober DealsAmazon USDeal season is back - check today's better picksAmazon US: current deals, useful picks and tech finds.See Picks×
Skip to content
BEAM

Fundamentos de Elixir: exercícios, contraexemplos e equívocos comuns

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Aprender Elixir fica mais sólido quando cada conceito é testado em três passos: transformar um dado pequeno, observar um caso que quebra a expectativa e explicar o limite da técnica. Pattern matching, imutabilidade, funções, recursão, Enum e tratamento de falhas formam o núcleo; exercícios progressivos mostram quando cada recurso é apropriado.

Os exemplos abaixo usam sintaxe compatível com Elixir moderno. A documentação consultada em 2 de outubro de 2026 identifica Elixir v1.20.4 como estável e Erlang/OTP 27, 28 e 29 como versões suportadas; confirme a combinação no momento de instalar em elixir-lang.org/docs.

1. Leia os dados antes de escolher a sintaxe

Elixir trabalha com valores imutáveis e transformações explícitas. Em vez de alterar uma estrutura existente, uma função recebe um valor e devolve outro. O ponto de partida de qualquer exercício é anotar o tipo de entrada e o tipo produzido em cada etapa.

Exercício: normalizar texto e contar frequências

A sequência usada na página inicial oficial é um bom laboratório de composição:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
texto = "Elixir, Elixir! Funcional"

frequencias =
  texto
  |> String.downcase()
  |> String.replace(~r/[^a-záéíóúãõçs]/u, "")
  |> String.split()
  |> Enum.frequencies()

Narre o resultado mentalmente: a entrada é uma string; depois continua string em minúsculas e sem pontuação; String.split/1 produz uma lista de palavras; Enum.frequencies/1 devolve um mapa com cada palavra e sua contagem. O pipeline não modifica texto.

Contraexemplo: esperar atualização no lugar

mapa = %{status: :pendente}
Map.put(mapa, :status, :pago)
IO.inspect(mapa) # %{status: :pendente}

atualizado = Map.put(mapa, :status, :pago)
IO.inspect(atualizado) # %{status: :pago}

Map.put/3 devolve um novo mapa. Esquecer de guardar o retorno é um erro de fluxo, não uma mutação silenciosa. Essa forma de pensar também torna cada etapa do pipeline observável e testável.

2. Pattern matching seleciona formas e extrai partes

O operador = faz correspondência de padrões e vincula nomes a valores compatíveis. Não é uma atribuição imperativa que substitui o conteúdo de uma variável.

Exercício: decompor tuplas, listas e mapas

{status, codigo} = {:ok, 200}
[primeiro | resto] = [10, 20, 30]
%{nome: nome} = %{nome: "Ana", idade: 30}

As correspondências extraem partes: status vale :ok, primeiro vale 10 e nome vale "Ana". Um padrão incompatível causa MatchError, o que torna uma entrada inválida explícita.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Exercício: múltiplas cláusulas e guards

def classificar({:ok, valor}) when is_number(valor), do: {:sucesso, valor}
def classificar({:erro, motivo}), do: {:falha, motivo}
def classificar(_), do: {:entrada_invalida, :formato_desconhecido}

As cláusulas descrevem formatos diferentes e o guard restringe o caso numérico. Essa estrutura é um dos blocos centrais destacados pela trilha do Exercism: padrões, cláusulas e guards trabalham juntos para decompor dados e escolher comportamento.

Contraexemplo: uma cláusula genérica que mascara formatos

def classificar(dado) do
  if elem(dado, 0) == :ok do
    :sucesso
  else
    :outro
  end
end

Essa versão pressupõe uma tupla, descarta informações e mistura entradas inválidas com erros legítimos. Um padrão específico documenta o contrato melhor. Ainda assim, não existe uma única solução obrigatória: escolha entre padrões, validação explícita e uma cláusula de fallback conforme o contrato da função.

3. Imutabilidade muda o desenho de atualizações

Exercício: atualizar um mapa em etapas

pedido = %{estado: :novo, total: 100}
com_pagamento = Map.put(pedido, :estado, :pago)
com_desconto = Map.update!(com_pagamento, :total, &(&1 * 0.9))

pedido, com_pagamento e com_desconto são valores distintos. Pergunte, após cada linha, qual valor foi devolvido e qual nome aponta para ele. Se várias transformações formarem um fluxo, o operador |> pode tornar a ordem explícita.

Equívoco: “= reatribui como em uma linguagem mutável”

x = 1
x = 2
# em uma sessão, o segundo = pode vincular x novamente;
# nenhuma estrutura anterior foi alterada no lugar

O significado exato depende do contexto de correspondência e das regras de vinculação, mas mapas, listas e tuplas nunca são modificados por uma chamada. Funções retornam versões novas, permitindo manter o valor anterior quando ele ainda é necessário.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

4. Recursão primeiro, Enum quando expressa a intenção

Exercício: somar uma lista recursivamente

defmodule Soma do
  def total([]), do: 0
  def total([cabeca | cauda]), do: cabeca + total(cauda)
end

A cláusula para lista vazia é o caso-base; a outra separa cabeça e cauda. Escreva testes para [], uma lista de um elemento e números negativos antes de otimizar.

Contraexemplo: recursão manual quando Enum é mais claro

total = Enum.sum([1, 2, 3, 4])
pares = Enum.filter([1, 2, 3, 4], &rem(&1, 2) == 0)

Enum comunica diretamente soma e filtragem e evita repetir infraestrutura de travessia. A recursão continua adequada quando o algoritmo tem estado específico, terminações incomuns ou precisa ensinar a decomposição de uma estrutura. A documentação de aprendizagem oficial apresenta recursão e funções de ordem superior; os cheatsheets de Enum aparecem na documentação de lançamentos, incluindo a de v1.16, em elixir-lang.org/blog/2023/12/22/elixir-v1-16-0-released.

5. Anti-patterns são sinais para investigar, não proibições

A referência oficial define anti-patterns como erros recorrentes ou indicadores de problemas, também chamados code smells. O guia organiza exemplos em categorias relacionadas a código, design, processo e metaprogramação, apresentando problema, exemplo e possível refatoração em hexdocs.pm/what-anti-patterns.html.

Como usar um alerta sem refatorar cegamente

  1. Nomeie o sintoma: duplicação, contrato ambíguo, fluxo difícil de testar ou metaprogramação excessiva.
  2. Verifique o contexto: tamanho do módulo, estabilidade da API, desempenho exigido e familiaridade da equipe.
  3. Compare uma alternativa pequena com a implementação atual em testes.
  4. Adote a mudança apenas se o comportamento, a leitura ou a manutenção realmente melhorarem.

Reconhecer uma anti-pattern não obriga a reescrever o trecho. A própria referência recomenda julgamento contextual; os guias foram ampliados no lançamento v1.16 e permanecem sujeitos à evolução da comunidade.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

6. Projeto integrador: Toy Robot

Depois de funções isoladas, implemente um robô em uma mesa 5×5. Essas dimensões, comandos em maiúsculas e demais regras são hipóteses da variante descrita no livro Toy Robot – The Elixir Version, não propriedades da linguagem.

Contrato sugerido

  • Estado inicial sem posição; comandos inválidos não devem mover o robô.
  • PLACE X,Y,DIRECTION posiciona dentro dos limites.
  • MOVE avança uma casa sem sair da mesa.
  • LEFT e RIGHT giram; REPORT devolve a posição e a direção.

Ordem de implementação e testes

  1. Modele o estado como um mapa ou struct e teste um posicionamento válido.
  2. Use pattern matching para separar cada comando e guards para coordenadas entre 0 e 4.
  3. Implemente rotação como transformação de valor, sem mutar o estado anterior.
  4. Teste movimento em cada borda, comando antes de PLACE e sequências de comandos.
  5. Execute os testes com ExUnit e acrescente doctests para exemplos curtos; o walkthrough usa uma aplicação Mix.

O exercício força decisões sobre contratos, limites, composição de funções e tratamento de falhas em um único comportamento observável.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

7. Equívocos que merecem um teste curto

“Pattern matching é apenas comparar igualdade”

Uma comparação pergunta se dois valores são iguais; {a, b} = {1, 2} simultaneamente verifica a forma e extrai partes. Múltiplas cláusulas e guards usam essa capacidade para selecionar comportamentos.

“Toda entrada deve cair em condicionais genéricas”

Condicionais podem ser úteis após uma validação, mas uma cláusula que declara o formato esperado costuma produzir erros mais localizados. Use um fallback deliberado quando a API realmente precisa aceitar entradas desconhecidas.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

“Elixir não faz análise de tipos”

O anúncio de v1.20, publicado em 3 de junho de 2026, descreve a primeira etapa de inferência e verificação gradual de programas sem anotações, encontrando violações que certamente falhariam em runtime. O mesmo anúncio informa que tipos recursivos, parâmetros, travessia de mapas e futuras assinaturas ainda exigem trabalho. Portanto, não trate o recurso como tipagem estática completa: consulte elixir-lang.org/blog/2026/06/03/elixir-v1-20-0-released para o estado da versão.

“Processo Elixir é processo do sistema operacional”

Processos da BEAM são unidades leves e isoladas que se comunicam por mensagens. Não os equipare automaticamente a processos do sistema operacional; leia a documentação de concorrência antes de transferir garantias de um modelo para o outro.

8. Uma sequência de estudo que cresce sem saltos

  1. Pratique strings, listas, mapas e pipelines narrando o tipo após cada transformação.
  2. Escreva funções com padrões, guards e cláusulas de fallback; teste formatos inválidos.
  3. Resolva uma redução por recursão e substitua-a por Enum quando a intenção ficar mais direta.
  4. Leia um anti-pattern e decida, com base no contexto, se a mudança é necessária.
  5. Integre tudo no Toy Robot e teste comportamento, não apenas funções internas.

A trilha de Elixir do Exercism oferece prática gratuita, análise automática e mentoria voluntária; a página consultada em 2026 lista 168 exercícios e 58 conceitos, números que podem mudar, em exercism.org/tracks/elixir. O diretório oficial de aprendizagem, em elixir-lang.org/learning, reúne livros e cursos para aprofundar depois dos exercícios.

9. Recursos e quando usá-los

Recurso Melhor uso Formato e feedback
Exercism Prática curta de fundamentos Gratuito, análise automática e mentoria voluntária
Documentação oficial Sintaxe, APIs e compatibilidade Referência online; versão estável e OTP devem ser conferidas
Toy Robot – The Elixir Version Projeto comportamental integrador PDF e EPUB; atualização informada em 15/07/2024; usa Mix, ExUnit e doctests
Cursos e outros livros Trilhas guiadas ou foco em OTP Opções listadas no diretório oficial; condições variam por material

Frequently Asked Questions

Qual versão de Elixir devo instalar para acompanhar os exemplos?

A documentação consultada em 2 de outubro de 2026 mostra Elixir v1.20.4 estável e suporte a Erlang/OTP 27, 28 e 29. Verifique a matriz atual em https://elixir-lang.org/docs/ antes da instalação.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Preciso dominar recursão antes de usar Enum?

Não. Implementar uma redução pequena por recursão ensina pattern matching e casos-base; depois, prefira Enum quando a operação pronta comunicar melhor a intenção.

Uma anti-pattern sempre exige refatoração?

Não. Ela é um sinal para investigar. A referência oficial recomenda avaliar contexto, testes e custos antes de alterar o código.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Leave a Reply

Your email address will not be published. Required fields are marked *

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Read next

Recommended PC Tool
Recommended PC Tool
PC Slower Than It Used to Be?Free scan - under a minute
Outdated Drivers Are Slowing You DownFree scan - exact matches

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.