window.pipedriveLeadboosterConfig = { base: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', versión: 2, } ;(function () { var w = window if (w.LeadBooster) { console.warn('LeadBooster ya existe') } else { w.LeadBooster = { q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: function (n) { this.q.push({ t: 't', n: n }) }, } } })() Programación funcional en JavaScript Parte 3 - Functor y Mónada Tal vez - The Codest
The Codest
  • Quiénes somos
  • Servicios
    • Desarrollo de software
      • Desarrollo Frontend
      • Desarrollo backend
    • Staff Augmentation
      • Desarrolladores frontales
      • Desarrolladores de backend
      • Ingenieros de datos
      • Ingenieros de la nube
      • Ingenieros de control de calidad
      • Otros
    • Asesoramiento
      • Auditoría y consultoría
  • Industrias
    • Fintech y Banca
    • E-commerce
    • Adtech
    • Tecnología sanitaria
    • Fabricación
    • Logística
    • Automoción
    • IOT
  • Valor para
    • CEO
    • CTO
    • Gestor de entregas
  • Nuestro equipo
  • Case Studies
  • Saber cómo
    • Blog
    • Meetups
    • Seminarios en línea
    • Recursos
Carreras profesionales Póngase en contacto
  • Quiénes somos
  • Servicios
    • Desarrollo de software
      • Desarrollo Frontend
      • Desarrollo backend
    • Staff Augmentation
      • Desarrolladores frontales
      • Desarrolladores de backend
      • Ingenieros de datos
      • Ingenieros de la nube
      • Ingenieros de control de calidad
      • Otros
    • Asesoramiento
      • Auditoría y consultoría
  • Valor para
    • CEO
    • CTO
    • Gestor de entregas
  • Nuestro equipo
  • Case Studies
  • Saber cómo
    • Blog
    • Meetups
    • Seminarios en línea
    • Recursos
Carreras profesionales Póngase en contacto
Flecha atrás VOLVER
2022-06-21
Desarrollo de software

Programación funcional en JavaScript Parte 3 - Functor y mónada Tal vez

The Codest

Pawel Ged

Vue.js Desarrollador

Consulta la tercera parte de nuestra serie de artículos El poder de la programación funcional en JavaScript. Esta vez nuestro experto en JavaScript explica más sobre Functor y Mónada Maybe.

Introducción

A menudo, mantener lo inmodificable es difícil de mantener. El patrón de envolver los datos en un contenedor viene al rescate. Asegura los valores para que su manipulación sea segura con exclusión de efectos secundarios.

Si eres nuevo aquí asegúrese de revisar mis últimas 2 partes con respecto a la programación funcional en The Codest blog sobre:

  • Parte 1 - Introducción
  • Parte 2 - Combinadores

Functor

No tiene una lógica compleja. Su tarea principal es envolver el contexto y realizar sobre él las funciones que recibe del exterior. Cada vez que cambia el valor, se vuelve a empaquetar una nueva instancia del contenedor y se devuelve. Cuando se llama al mapa que toma una acción específica, devuelve una nueva instancia de contenedor con el valor devuelto por la función pasada, manteniendo el principio de no modificabilidad.

Declaración

 const Functor = valor => ({
     mapa: fn => Functor(fn(valor)),
     cadena: fn => fn(valor),
     de: () => valor
 });

mapa - útil cuando quieres cambiar el estado de un valor en un contenedor pero no quieres devolverlo todavía.

cadena - se utiliza si se desea pasar un valor a una función sin modificar el estado del contenedor. Suele ir al final de mapa llamadas.

de - devolver valor actual

Ejemplo imperativo

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

const randomNumber = randomInt(200) // devuelve un número entre 0 y 200

decrease(randomNumber) // devuelve (número entre 0 y 200) - 1

Ejemplo declarativo

const randomIntWrapper = (max) =>
Functor(max)
.map(incremento) // max + 1
.map(multiplicarPor(Math.aleatorio())) // Math.random() * (max + 1)
.map(Math.floor) // Math.floor(Math.random() * (max + 1))

const randomNumber = randomIntWrapper(200)

randomNumber.of() // devuelve un número entre 0 y 200
randomNumber.chain(decrease) // devuelve (número entre 0 y 200) - 1

Mónada

A veces, además de las funciones que activan el nuevo estado del valor, necesitas lógica adicional oculta en el contenedor. Aquí es donde mónada es muy útil, ya que es una extensión de functor. Puede, por ejemplo, decidir qué debe ocurrir cuando el valor tiene un valor determinado o qué camino deben seguir las siguientes acciones.

Mónada Tal vez

La mónada quizás resuelve el problema de los valores que devuelven no verdadero. Cuando esto ocurre, las subsiguientes mapa se ignoran, pero permite devolver una alternativa llamando a la función getOr método. Le permite evitar el uso de operadores if / else, que son populares en imperativo programación. Esta mónada consta de tres contenedores:

Nada - se ejecuta cuando un valor que no es verdadero cae en el contenedor o filtro devuelve false. Se utiliza para simular la ejecución de una función. Esto significa que este contenedor recibe la función pero no la ejecuta.

Sólo - este es el contenedor principal que realiza todas las funciones, pero si el valor cambia a un valor falso o filtro devuelve false, lo pasará al método Nada contenedor.

Tal vez - Tomo el valor inicial y decido qué contenedor llamar al principio.

Declaración

const Just = valor => ({
mapa: fn => Maybe(fn(valor)),
cadena: fn => fn(valor),
de: () => valor,
getOr: () => valor,
filtro: fn => fn(valor) ? Sólo(valor) : Nada(),
tipo: 'just'
});

const Nada = () => ({
mapa: fn => Nada(),
cadena: fn => fn(),
de: () => Nada(),
getOr: sustituto => sustituto,
filtro: () => Nothing(),
tipo: 'nada
});

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

Ahora vamos a construir el ejemplo anterior sobre la condición. Si max es mayor que cero, la función se ejecutará. En caso contrario, devolverá 0.

Ejemplo 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 // devuelve random
const randomPage = randomInt(-10) || bookMiddlePage // devuelve 200

Ejemplo declarativo

const randomIntWrapper = (max) =>
Maybe(max)
.filter(max => max > 0) // valor false ignora llamadas posteriores
.map(incremento)
.map(multiplicarPor(Math.aleatorio()))
.map(Math.floor)

const libroPáginaIntermedia = 200

// Sólo contenedor
const randomPage = randomIntWrapper(10).getOr(bookMiddlePage) // devuelve aleatorio
// Contenedor nada
const randomPage = randomIntWrapper(-10).getOr(bookMiddlePage) // devuelve 200


bandera de cooperación

Artículos relacionados

Desarrollo de software

Asíncrono y monohilo JavaScript?

JavaScript es un lenguaje monohilo y, al mismo tiempo, también no bloqueante, asíncrono y concurrente. Este artículo le explicará cómo sucede.

Lukasz Kolko
E-commerce

Dilemas de ciberseguridad: Filtraciones de datos

La fiebre prenavideña está en pleno apogeo. En busca de regalos para sus seres queridos, la gente está cada vez más dispuesta a "asaltar" las tiendas en línea

The Codest
Jakub Jakubowicz CTO y Cofundador

Suscríbase a nuestra base de conocimientos y manténgase al día de la experiencia del sector informático.

    Quiénes somos

    The Codest - Empresa internacional de desarrollo de software con centros tecnológicos en Polonia.

    Reino Unido - Sede central

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

    Polonia - Centros tecnológicos locales

    • Parque de oficinas Fabryczna, Aleja
      Pokoju 18, 31-564 Cracovia
    • Embajada del Cerebro, Konstruktorska
      11, 02-673 Varsovia, Polonia

      The Codest

    • Inicio
    • Quiénes somos
    • Servicios
    • Case Studies
    • Saber cómo
    • Carreras profesionales
    • Diccionario

      Servicios

    • Asesoramiento
    • Desarrollo de software
    • Desarrollo backend
    • Desarrollo Frontend
    • Staff Augmentation
    • Desarrolladores de backend
    • Ingenieros de la nube
    • Ingenieros de datos
    • Otros
    • Ingenieros de control de calidad

      Recursos

    • Hechos y mitos sobre la cooperación con un socio externo de desarrollo de software
    • De EE.UU. a Europa: ¿Por qué las startups estadounidenses deciden trasladarse a Europa?
    • Comparación de los polos de desarrollo de Tech Offshore: Tech Offshore Europa (Polonia), ASEAN (Filipinas), Eurasia (Turquía)
    • ¿Cuáles son los principales retos de los CTO y los CIO?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Condiciones de uso del sitio web

    Copyright © 2025 por The Codest. Todos los derechos reservados.

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