"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Introdução à Programação Funcional em JavaScript: Faça mônadas #12

Introdução à Programação Funcional em JavaScript: Faça mônadas #12

Publicado em 2024-08-25
Navegar:130

Introduction to Functional Programming in JavaScript: Do monads #12

Na programação funcional, mônadas fornecem uma maneira de lidar com cálculos de maneira estruturada e previsível. Entre as várias mônadas, a Do Monad (também conhecida como "notação Do" ou "compreensão da mônada") é uma construção poderosa que permite um tratamento mais legível e de estilo imperativo de operações monádicas.

O que é Do Mônada?

O Do Monad é um açúcar sintático que simplifica o trabalho com mônadas, permitindo que você escreva sequências de operações monádicas em um estilo que se assemelha à programação imperativa. Em vez de encadear operações com .then ou .flatMap, o Do Monad permite escrever um código mais direto e legível.

Benefícios do Do Monad

  1. Legibilidade: permite escrever operações monádicas complexas de uma forma limpa e linear.
  2. Estilo Imperativo: Fornece uma maneira de expressar cálculos monádicos em um estilo familiar para aqueles acostumados com programação imperativa.
  3. Tratamento de erros: Simplifica o tratamento de erros em operações monádicas, fornecendo uma estrutura clara e consistente.

Implementando Do Monad em JavaScript

Embora o JavaScript não tenha suporte integrado para Do Monad como Haskell, podemos implementar uma construção semelhante usando funções geradoras e um executor personalizado.

Exemplo: Implementando um Do Monad Runner

Vamos começar implementando um executor Do Monad que pode lidar com mônadas Promise.

function* doGenerator() {
  const a = yield Promise.resolve(1);
  const b = yield Promise.resolve(2);
  const c = yield Promise.resolve(a   b);
  return c;
}

function runDo(genFunc) {
  const iter = genFunc();

  function handle(result) {
    if (result.done) return Promise.resolve(result.value);
    return Promise.resolve(result.value).then(res => handle(iter.next(res)));
  }

  return handle(iter.next());
}

// Usage
runDo(doGenerator).then(result => console.log(result)); // 3

Neste exemplo, doGenerator é uma função geradora que produz promessas. A função runDo executa o gerador, manipulando cada promessa produzida e passando o valor resolvido de volta para o gerador.

Aplicações Práticas do Do Monad

O Do Monad pode ser usado em vários cenários onde as operações monádicas precisam ser sequenciadas de maneira legível e sustentável.

Exemplo: Tratamento de operações assíncronas

Vamos aprimorar o exemplo anterior para lidar com operações assíncronas mais complexas.

function* fetchUserData() {
  const user = yield fetch('https://api.example.com/user/1').then(res => res.json());
  const posts = yield fetch(`https://api.example.com/user/${user.id}/posts`).then(res => res.json());
  const firstPost = posts[0];
  const comments = yield fetch(`https://api.example.com/posts/${firstPost.id}/comments`).then(res => res.json());
  return { user, firstPost, comments };
}

runDo(fetchUserData).then(result => console.log(result));

Neste exemplo, fetchUserData é uma função geradora que produz promessas para buscar dados do usuário, suas postagens e comentários na primeira postagem. A função runDo executa essas operações assíncronas de maneira legível e estruturada.

Exemplo: Tratamento de valores opcionais com Maybe Monad

Também podemos usar o padrão Do Monad com outras mônadas como Maybe.

class Maybe {
  constructor(value) {
    this.value = value;
  }

  static of(value) {
    return new Maybe(value);
  }

  map(fn) {
    return this.value === null || this.value === undefined ? Maybe.of(null) : Maybe.of(fn(this.value));
  }

  flatMap(fn) {
    return this.value === null || this.value === undefined ? Maybe.of(null) : fn(this.value);
  }
}

function* maybeDoGenerator() {
  const a = yield Maybe.of(1);
  const b = yield Maybe.of(2);
  const c = yield Maybe.of(a   b);
  return c;
}

function runMaybeDo(genFunc) {
  const iter = genFunc();

  function handle(result) {
    if (result.done) return Maybe.of(result.value);
    return result.value.flatMap(res => handle(iter.next(res)));
  }

  return handle(iter.next());
}

// Usage
const result = runMaybeDo(maybeDoGenerator);
console.log(result); // Maybe { value: 3 }

Neste exemplo, MaybeDoGenerator é uma função geradora que funciona com a mônada Maybe. A função runMaybeDo executa o gerador, manipulando cada valor Maybe produzido e passando o valor desembrulhado de volta para o gerador.

O Do Monad é uma construção poderosa que simplifica o trabalho com mônadas, permitindo que você escreva sequências de operações monádicas em um estilo mais legível e imperativo. Ao implementar um executor Do Monad, você pode lidar com operações assíncronas complexas, valores opcionais e outros cálculos monádicos de uma forma estruturada e sustentável.

Embora o JavaScript não suporte nativamente a sintaxe Do Monad, usando funções geradoras e executores personalizados, você pode obter funcionalidades semelhantes. Essa abordagem melhora a legibilidade e a manutenção do seu código, facilitando o trabalho com operações monádicas em um estilo de programação funcional.

Declaração de lançamento Este artigo está reproduzido em: https://dev.to/francescoagati/introduction-to-funcional-programming-in-javascript-do-monads-12-362a?1 Se houver alguma violação, entre em contato com [email protected] para excluí-lo
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3