Una Introcci ón a las m ó nadas (영어 javascript)

몬나다스 가문.el mundo javascript의 Innomembrables.Hoy hablaremos de ellas,para ser más específico lo que haremos serárevisar“una definición de mónadas que leípor ahí,laúnica que no hace que mi cerebro explote.Para mantener nuestra cordura intacta sólo vamos a explorar los aspectos que podemos modelar fácilmente usando javascript.?Todo el mundo listo?Comencemos.
아쿠와모스.Esta seráfácil,se los juro.Las mónadas son...

functores puntiagudos que pueden aplanarse.


Dijeron que estaban listos.En fin,podemos con esto.Sólo tienen que conocer cuál es el comportamiento de un functor y los demáS serápan comido.

Presentando a los Functores 회사


Si hablamos de javascript,la forma más común de implementar un functor es creando una specie contenedor con una característica special:debe permitirnos transformar el valor interno en cualquier forma que nosotros queramos sin tener que dejar el contenedor.
Acaso는 Suena한테 관심 없어요??Cómo se vería eso en Código?Intentemos creando el functor más simple que podamos imaginar.

라카자


function Caja(data) {
  return {
    map(fn) {
      return Caja(fn(data));
    }
  }
}
매실Bueno,tenemos unaCajadiseñada speccíficamente para almacenar un valor que llamamosdatay laúnica manera de llegar a ese valor es a través del métodomap.En esta instanciamaprecibe una funciónfn(un callback)como argumento,aplica esta función adatay coloca el resultado de la función En una nuevaCaja.todos los functores lucen as í, pero en general todos siguen este patrón. Ahora vamos a usarlo가 없습니다.
const xbox = Caja('x');
const to_uppercase = (str) => str.toUpperCase();

xbox.map(to_uppercase).map(console.log);
// => X
// => Object { map: map() }
수행원,tenemosestaCajaqueesum...totalmente inútil.Sip, y eso는 propósito입니다.Verán,lo que tenemos aqíes el functorIdentidad.Suutilidad en el'mundo real'은 토론할 수 있는 pero para ilustrar el patrón de los functors con fines educativos Functiona de maravilla입니다.
Muy bonito todo?Pero cuáles son los Bengiios que nos traen estas cosas,los functores?Al agregar esta pequeña abstracción obtenemos la habilidad de separar un“efecto”de una computación pura.Para aclarar un poco mi punto vamos a darle un vistazo a un functor que sítiene un propósito.

Un rostro 익숙함


없음 sési est á n al tanto o No pero les dir é de todas formas, los arreglos siguen el patrón que les acabo de de describir.Prueben esto.
const xbox = ['x'];
const to_uppercase = (str) => str.toUpperCase();

xbox.map(to_uppercase);
// => Array [ "X" ]
El arreglo es un contendor,tiene un métodomapEl cual nos permite Transformer El contenido del arreglo,y los nuevos valores que se originan de la función son puestos nuevamente en un arreglo.
Bien,pero ahora?Cuál es el“efecto”de un arreglo?Ellos nos permiten almacenar múltiples valores en una sola estrastructa,eso es lo que hacent.Array.map 특히 알레그로의 한 단원에서.si tienen un arreglo con 100 elementos o uno que est é vac ío, .mapse encarga de la lógica que dicta cuando debe ejecutarse la función para que ustedes se concentren que debe hacer con elemento dentro de la estrustructure를 입력할 필요가 없습니다.
Y por supuesto los functores se pueden usar para muchas otras cosas,como el manejo de errors o validar la ausencia de valores e incluso para procesos asíncronos.Me gustaría seguir hablando de este tema pero debemos seguir con la definición de mónada.

라파트 puntiaguda


Necesitamos que nuestros functores sean“puntiagudos”.Esta es una manera graciosa de decirnos que necesitamos una función auxiliar que pueda colocar cualquier valor ordinario dentro de la unidad más simple de nuestra estrructura.Esta función es conocida como'순수', otros nombres también incluyen'단위 y'.
Volvamos a visitar a nuestro viejo amigoArray.당신의colocamos un valor dentro de la unidad más simple de una arreglo,quétenemos?Sí,un arreglo con un solo elemento.Curiosamente hay una función que puede hacer eso por nosotros.
Array.of('¿en serio?');
// => Array [ "¿en serio?" ]

Array.of(42);
// => Array [ 42 ]

Array.of(null);
// => Array [ null ]
Algo como esto puede ser SPECIALMENTEútil si la forma normal de crear un functor es complicada.Con esta función podríamos envolver cualquier valor que queramos y empezar a usar.mapin mediatamente.Podría contarles más sobre esta función pero esa es básicamente la idea.시그모스.

평면 인디언


뭐 공부 해요?Esperen...?cuál es exactamente el problema?
Imagineen esta situación,tenemos un número en unaCajay queremos usar.mappara aplicar una función que llamaremosaccion.아르고 아스.
const numero = Caja(41);
const accion = (numero) => Caja(numero + 1);

const resultado = numero.map(accion);
Todo parece estar bien hasta que nos damos cuenta queaccionnos regresa otraCaja.Entonsresultadoes de hecho unaCajadentro de otraCaja:Caja(Caja(42)).Ahora para accepter al valor tendríamos que hacer esto.
resultado.map((caja) => caja.map((valor) => {/* código */}));
Eso는 est á bien이 없습니다.Nadie quiere lidiar con una estrustructa así.아유다노(Aquies donde las mónadas pueden ayudarnos).Ellas nos dan la“habilidad”de fusionar estas capas innecesarias que crean una estructure a anidada.En nuestro caso puede transformarCaja(Caja(42))EnCaja(42).코모?Con la ayuda de un método llamadojoin.
Asísería la implementación en nuestraCaja.
  function Caja(data) {
    return {
      map(fn) {
        return Caja(fn(data));
      },
+     join() {
+       return data;
+     }
    }
  }
네, 저는 팽산도입니다. 파리스 쿠스 쿠스 포시난도 나다는 없습니다.Quiqáhastaestén pensando en cambialle el nombre al método y ponerle'발췌'.Sólo esperen un momento.Volvamos a nuestro ejemplo conaccion,vamos a arreglarlo.
const resultado = numero.map(accion).join();
아호라 시트네모스 우나Caja(42), 공 에스토 포드모스.map.규?너는 나를 미라나스리라고 부르니?Bien,digamos que le cambio el nombre.아홀라는 아시다.
const resultado = numero.map(accion).extract();
Este es el problema,si leo esa línea por sísola yo asumiría queresultadoes un valor ordinario,algo que pueda usar libremente,me voy a molestar un poco cuando descubra que en realidad tengo unaCaja.Por otra parte,si veojoinséqueresultadoaún es una mónada y puedo prepararme para ello.
Ahora pueden estar pensando“Bien,ya entendíPero sabes quéYo uso javascript,simplemente voy a ignorar totalmente los functores y no necestaréesas mónadas”.Totalmente válido,pueden hacer eso.La mala noticia es que los arreglos son functores asíque no pueden escapar de ellos.La buena noticia es que los arregos son mónadas asíque cuando se encumentren con ese problem de estrustructuras anidadas(y lo harán)pueden arreglarlo fácilmente.
Los Arregos no tienen un métodojoin...부에노,sílotienenenperosellamaflat.콘탄프론.
[[41], [42]].flat();
// => Array [ 41, 42 ]
Y ahílo tienen,después de llamar aflatpueden seguir con sus vidas sin tener que preocuparse por“capas”innecesarias entorpeciendo su camino.Eso es todo,en la práctica esto es básicamente el problema que las mónadas resuelven.
페로 앤트스 드 일메 규로 텍스 우나 코사 마스.

Mónadas en secuencia


Resulta que esta combinación demap/joines tan común que hay un método que combina las características de esos dos.Este también tiene varios nombres:'사슬','평면도','귀속','>='(en haskell).Los arreglos lo llamanflatMap.
const split = str => str.split('/');

['some/stuff', 'another/thing'].flatMap(split);
// => Array(4) [ "some", "stuff", "another", "thing" ]
아카소 불친절?아레그로스 아니다도스 소로 테네모스와 그랜 아레그로.Esto es mucho más fácil de manejar que una estrustructure a anidada.
Pero esto no sólo es para ahorrar unos cuantos caracteres,también fomenta la composición de functiones de la misma forma que.maplo hace.Podrían hacer algo como esto.
monad.flatMap(action)
  .map(another)
  .map(cool)
  .flatMap(getItNow);
estoy diciendo que hagan esto con los arreglos가 없습니다.Les estoy diciendo que si crean sus propias mónadas pueden combinar functiones de esta manera.Sólo tienen que recordar si su función returna una mónada usanflatMap,si no usanmap.

결론


Aprendimos que las mónadas son functores con características extras.엔 오트라스 파라블라스의 아들 코네도리스 마지코스 규...les gusta tener otros Contendores Intermante가 없다고요?Intentemos nuevamente:son como cebollas mágicas que...중요하지 않아요. 아들 mágicos, dejémoslo así.
Podemos usarlos para añadir un“efecto”a cualquier valor ordinario.Podemos usarlos para el manejo de Errors,operaciones asíncronas,controlar efectos secundarios,y un montón de cosas más.
También aprendimos que a las mónadas se les quiere o se les tiene un odio irracional,y no hay ningún punto medio.

푸엔테스

  • Professor Frisby's Mostly Adequate Guide to Functional Programming. Chapter 9: Monadic Onions
  • Funcadelic.js
  • Fantasy Land
  • 그레시아스 폴 수 틴보.Si este artículo les pareciótil y quieren apoyar mis esfuerzos para crear más contenido,pueden dejar una propina enbuy me a coffee ☕.

    좋은 웹페이지 즐겨찾기