Una Introcci ón a las m ó nadas (영어 javascript)
16282 단어 functionalspanishjavascript
아쿠와모스.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 unaCaja
diseñada speccíficamente para almacenar un valor que llamamosdata
y laúnica manera de llegar a ese valor es a través del métodomap
.En esta instanciamap
recibe una funciónfn
(un callback)como argumento,aplica esta función adata
y 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() }
수행원,tenemosestaCaja
queesum...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étodomap
El 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, .map
se 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 amigo
Array
.당신의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.map
in 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 una
Caja
y queremos usar.map
para 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 queaccion
nos regresa otraCaja
.Entonsresultado
es de hecho unaCaja
dentro 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 nuestra
Caja
. 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 queresultado
es 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 veojoin
séqueresultado
aú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étodo
join
...부에노,sílotienenenperosellamaflat
.콘탄프론.[[41], [42]].flat();
// => Array [ 41, 42 ]
Y ahílo tienen,después de llamar aflat
pueden 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 de
map/join
es 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
.map
lo 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.
푸엔테스
Reference
이 문제에 관하여(Una Introcci ón a las m ó nadas (영어 javascript)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/vonheikemen/una-introduccion-a-las-monadas-en-javascript-4hg0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)