The Codest
  • Sobre nós
  • Serviços
    • Desenvolvimento de software
      • Desenvolvimento de front-end
      • Desenvolvimento backend
    • Staff Augmentation
      • Programadores Frontend
      • Programadores de back-end
      • Engenheiros de dados
      • Engenheiros de nuvem
      • Engenheiros de GQ
      • Outros
    • Aconselhamento
      • Auditoria e consultoria
  • Indústrias
    • Fintech e Banca
    • E-commerce
    • Adtech
    • Tecnologia da saúde
    • Fabrico
    • Logística
    • Automóvel
    • IOT
  • Valor para
    • CEO
    • CTO
    • Gestor de entregas
  • A nossa equipa
  • Case Studies
  • Saber como
    • Blogue
    • Encontros
    • Webinars
    • Recursos
Carreiras Entrar em contacto
  • Sobre nós
  • Serviços
    • Desenvolvimento de software
      • Desenvolvimento de front-end
      • Desenvolvimento backend
    • Staff Augmentation
      • Programadores Frontend
      • Programadores de back-end
      • Engenheiros de dados
      • Engenheiros de nuvem
      • Engenheiros de GQ
      • Outros
    • Aconselhamento
      • Auditoria e consultoria
  • Valor para
    • CEO
    • CTO
    • Gestor de entregas
  • A nossa equipa
  • Case Studies
  • Saber como
    • Blogue
    • Encontros
    • Webinars
    • Recursos
Carreiras Entrar em contacto
Seta para trás VOLTAR
2022-06-21
Desenvolvimento de software

Programação funcional em JavaScript Parte 3 - Functor e Mónada Talvez

The Codest

Pawel Ged

Programador Vue.js

Confira a terceira parte da nossa série de artigos Poder da programação funcional no JavaScript. Desta vez, nosso especialista em JavaScript explica mais sobre Functor e Monad Maybe.

Introdução

Muitas vezes, é difícil manter os dados inalteráveis. O padrão de envolver os dados num contentor vem em seu socorro. Protege os valores para que o seu manuseamento seja seguro, excluindo os efeitos secundários.

Se é novo aqui, não deixe de ver as minhas duas últimas partes sobre programação funcional no blogue The Codest:

  • Parte 1 - Introdução
  • Parte 2 - Combinadores

Functor

Não tem uma lógica complexa. A sua principal tarefa é envolver o contexto e executar as funções que recebe do exterior. Cada vez que o valor muda, uma nova instância do contentor é reembalada e devolvida. Ao chamar o mapa que executa uma ação específica, devolve uma nova instância de contentor com o valor devolvido pela função passada, mantendo o princípio de não modificabilidade.

Declaração

 const Functor = value => ({
     map: fn => Functor(fn(value)),
     cadeia: fn => fn(valor),
     of: () => valor
 });

mapa - útil quando se pretende alterar o estado de um valor num contentor mas não se pretende devolvê-lo ainda.

cadeia - utilizado se quiser passar um valor para uma função sem modificar o estado do contentor. Geralmente no final de mapa chamadas.

de - devolver o valor atual

Exemplo imperativo

const randomInt = (max) => Math.floor(Math.random() * (max + 1))

const randomNumber = randomInt(200) // devolve um número entre 0 e 200

decrease(randomNumber) // devolve (número entre 0 e 200) - 1

Exemplo declarativo

const randomIntWrapper = (max) =>
Functor(max)
.map(increase) // max + 1
.map(multiplyBy(Math.random())) // Math.random() * (max + 1)
.map(Math.floor) // Math.floor(Math.random() * (max + 1))

const randomNumber = randomIntWrapper(200)

randomNumber.of() // devolve um número entre 0 e 200
randomNumber.chain(decrease) // devolve (número entre 0 e 200) - 1

Mónada

Por vezes, para além das funções que accionam o novo estado do valor, é necessária uma lógica adicional oculta no contentor. É aqui que a mônada se torna útil, pois é uma extensão de functor. Pode, por exemplo, decidir o que deve acontecer quando o valor tem um determinado valor ou qual o caminho que as próximas acções devem seguir.

Mónada Talvez

A mónada talvez resolva o problema dos valores que retornam não verdadeiros. Quando isso acontece, as mapa são ignoradas, mas permite-lhe devolver uma alternativa chamando o getOr método. Permite-lhe evitar a utilização de operadores if / else, que são populares em imperativo programação. Esta mónada é constituída por três contentores:

Nada - é executado quando um valor que não é verdadeiro cai no contentor ou filtro devolve falso. É utilizado para simular a execução de uma função. Isto significa que este contentor recebe a função mas não a executa.

Só - este é o contentor principal que executa todas as funções, mas se o valor mudar para um valor falso ou filtro retorna falso, ele passará para o método Nada contentor.

Talvez - Pego no valor inicial e decido qual o contentor a chamar no início.

Declaração

const Just = value => ({
map: fn => Maybe(fn(value)),
chain: fn => fn(value),
of: () => value,
getOr: () => valor,
filtro: fn => fn(valor) ? Just(value) : Nothing(),
type: 'just'
});

const Nothing = () => ({
map: fn => Nothing(),
chain: fn => fn(),
of: () => Nothing(),
getOr: substitute => substitute,
filter: () => Nothing(),
type: 'nothing'
});

const Maybe = valor =>
value === null || value === undefined || value.type === 'nothing'
? Nada()
: Just(value)
tabela métodos functor

Agora vamos construir o exemplo anterior sobre a condição. Se max for maior que zero, a função será executada. Caso contrário, retornará 0.

Exemplo imperativo

const randomInt = (max) => {
if(max > 0) {
return Math.floor(Math.random() * (max + 1))
} else {
return 0
}
}

const bookMiddlePage = 200

const randomPage = randomInt(10) || bookMiddlePage // devolve aleatório
const randomPage = randomInt(-10) || bookMiddlePage // devolve 200

Exemplo declarativo

const randomIntWrapper = (max) =>
Talvez(max)
.filter(max => max > 0) // o valor false ignora outras chamadas
.map(increase)
.map(multiplyBy(Math.random()))
.map(Math.floor)

const bookMiddlePage = 200

// Apenas contentor
const randomPage = randomIntWrapper(10).getOr(bookMiddlePage) // retorna aleatório
// Contentor de nada
const randomPage = randomIntWrapper(-10).getOr(bookMiddlePage) // devolve 200


faixa de cooperação

Artigos relacionados

Desenvolvimento de software

Assíncrono e Single-threaded JavaScript?

JavaScript é uma linguagem single-threaded e, ao mesmo tempo, também non-blocking, assíncrona e concorrente. Este artigo explica-lhe como isso acontece.

Lukasz Kolko
E-commerce

Dilemas da cibersegurança: Fugas de dados

A corrida pré-natalícia está ao rubro. Em busca de presentes para os seus entes queridos, as pessoas estão cada vez mais dispostas a "invadir" as lojas em linha

The Codest
Jakub Jakubowicz CTO e cofundador

Subscreva a nossa base de conhecimentos e mantenha-se atualizado sobre os conhecimentos do sector das TI.

    Sobre nós

    The Codest - Empresa internacional de desenvolvimento de software com centros tecnológicos na Polónia.

    Reino Unido - Sede

    • Office 303B, 182-184 High Street North E6 2JA
      Londres, Inglaterra

    Polónia - Pólos tecnológicos locais

    • Parque de escritórios Fabryczna, Aleja
      Pokoju 18, 31-564 Cracóvia
    • Embaixada do Cérebro, Konstruktorska
      11, 02-673 Varsóvia, Polónia

      The Codest

    • Início
    • Sobre nós
    • Serviços
    • Case Studies
    • Saber como
    • Carreiras
    • Dicionário

      Serviços

    • Aconselhamento
    • Desenvolvimento de software
    • Desenvolvimento backend
    • Desenvolvimento de front-end
    • Staff Augmentation
    • Programadores de back-end
    • Engenheiros de nuvem
    • Engenheiros de dados
    • Outros
    • Engenheiros de GQ

      Recursos

    • Factos e mitos sobre a cooperação com um parceiro externo de desenvolvimento de software
    • Dos EUA para a Europa: Porque é que as empresas americanas decidem mudar-se para a Europa?
    • Comparação dos centros de desenvolvimento da Tech Offshore: Tech Offshore Europa (Polónia), ASEAN (Filipinas), Eurásia (Turquia)
    • Quais são os principais desafios dos CTOs e dos CIOs?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Website terms of use

    Direitos de autor © 2026 por The Codest. Todos os direitos reservados.

    pt_PTPortuguese
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese es_ESSpanish nl_NLDutch etEstonian elGreek cs_CZCzech pt_PTPortuguese