"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Introducción a la programación funcional en JavaScript: mónadas y funtores #7

Introducción a la programación funcional en JavaScript: mónadas y funtores #7

Publicado el 2024-07-29
Navegar:296

Introduction to Functional Programming in JavaScript: Monad and functors #7

Las mónadas y los functores son conceptos avanzados en programación funcional que proporcionan abstracciones poderosas para manejar transformaciones de datos, efectos secundarios y composición. Si bien se originan en la teoría de categorías en matemáticas, tienen aplicaciones prácticas en lenguajes de programación como JavaScript.

¿Qué es un functor?

Un funtor es un tipo de datos que implementa un método de mapa, que aplica una función al valor dentro del funtor y devuelve un nuevo funtor con el valor transformado. En esencia, los functores le permiten aplicar una función a un valor ajustado sin cambiar la estructura del contenedor.

Ejemplo de functor
class Box {
  constructor(value) {
    this.value = value;
  }

  map(fn) {
    return new Box(fn(this.value));
  }
}

// Usage
const box = new Box(2);
const result = box.map(x => x   3).map(x => x * 2);
console.log(result); // Box { value: 10 }

En este ejemplo, Box es un funtor. El método map aplica la función fn al valor dentro del cuadro y devuelve un nuevo cuadro con el valor transformado.

¿Qué es una mónada?

Una mónada es un tipo de functor que implementa dos métodos adicionales: of (o return en algunos idiomas) y flatMap (también conocido como bind o chain). Las mónadas proporcionan una forma de encadenar operaciones sobre el valor contenido manteniendo al mismo tiempo el contexto de la mónada.

Propiedades de las mónadas
  1. Unidad (de): Un método que toma un valor y devuelve una mónada que contiene ese valor.
  2. Bind (flatMap): Un método que toma una función que devuelve una mónada y la aplica al valor contenido, aplanando el resultado.
Ejemplo de mónada
class Box {
  constructor(value) {
    this.value = value;
  }

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

  map(fn) {
    return Box.of(fn(this.value));
  }

  flatMap(fn) {
    return fn(this.value);
  }
}

// Usage
const box = Box.of(2);
const result = box
  .flatMap(x => Box.of(x   3))
  .flatMap(x => Box.of(x * 2));
console.log(result); // Box { value: 10 }

En este ejemplo, Box es a la vez un funtor y una mónada. El método of envuelve un valor en un Box y el método flatMap aplica una función al valor contenido y devuelve la mónada resultante.

Casos de uso práctico de mónadas y functores

Las mónadas y funtores no son sólo construcciones teóricas; Tienen aplicaciones prácticas en la programación del mundo real. Exploremos algunos casos de uso comunes.

Manejo de valores opcionales con Maybe Monad

La mónada Maybe se utiliza para manejar valores opcionales, evitando valores nulos o indefinidos y proporcionando una forma segura de encadenar operaciones.

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

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

  isNothing() {
    return this.value === null || this.value === undefined;
  }

  map(fn) {
    return this.isNothing() ? this : Maybe.of(fn(this.value));
  }

  flatMap(fn) {
    return this.isNothing() ? this : fn(this.value);
  }
}

// Usage
const maybeValue = Maybe.of('hello')
  .map(str => str.toUpperCase())
  .flatMap(str => Maybe.of(`${str} WORLD`));
console.log(maybeValue); // Maybe { value: 'HELLO WORLD' }

En este ejemplo, la mónada Maybe maneja de forma segura el valor opcional, permitiendo transformaciones solo si el valor no es nulo o no está definido.

Manejo de operaciones asincrónicas con Promise Monad

Las promesas en JavaScript son mónadas que manejan operaciones asincrónicas, proporcionando una forma de encadenar operaciones y manejar errores.

const fetchData = url => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(`Data from ${url}`);
    }, 1000);
  });
};

// Usage
fetchData('https://api.example.com')
  .then(data => {
    console.log(data); // 'Data from https://api.example.com'
    return fetchData('https://api.example.com/2');
  })
  .then(data => {
    console.log(data); // 'Data from https://api.example.com/2'
  })
  .catch(error => {
    console.error(error);
  });

Las promesas le permiten manejar operaciones asincrónicas de una manera limpia y componible, encadenando operaciones y manejando errores con elegancia.

Las mónadas y los functores son abstracciones poderosas en la programación funcional que le permiten trabajar con transformaciones de datos, efectos secundarios y composición de una manera más estructurada y predecible.

Si bien los fundamentos matemáticos de las mónadas y los functores pueden ser complejos, sus aplicaciones prácticas son muy valiosas en la programación del mundo real. Ya sea que esté manejando valores opcionales con la mónada Maybe o administrando operaciones asincrónicas con Promises, estas técnicas de programación funcional pueden ayudarlo a crear aplicaciones más sólidas y confiables.

Declaración de liberación Este artículo se reproduce en: https://dev.to/francescoagati/introduction-to-functional-programming-in-javascript-monad-and-functors-7-1l6l?1 Si hay alguna infracción, comuníquese con Study_golang@163 .com para eliminarlo
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3