쪽지 소개 (js)
Pueden leer la versión en español .
오, 악명 높은 M자.우리가javascript에서 언급하지 않은 것.좋아, 오늘 우리는 그것을 토론할 거야. 특히 우리는 내가 매우 좋아하는 정의를 되돌아봐야 해. 유일하게 나를 현기증 나게 하지 않는 정의.이성을 유지하기 위해서, 우리는javascript 모델링을 사용할 수 있는 방면을 탐색할 것이다.여러분 준비되셨나요?시작합시다.
여기 있습니다.나는 이것이 매우 간단하다고 맹세한다.명세서는...
pointed functors that can flatten.
준비됐다고?어쨌든 우리는 할 수 있다.일단 네가 편지의 행위를 이해하면 나머지는 알게 될 것이다.
입력 편지
javascripty의 측면에서 볼 때, 당신은 그것들을 매우 특수한 기능을 가진 용기로 간주할 수 있습니다. 이것은 당신이 생각하는 모든 방식으로 내부 가치를 전환할 수 있으며, 상기 용기를 떠나지 않아도 됩니다.
이거 재밌지 않아요?이것은 코드에서 어떤 모양입니까?우리가 생각할 수 있는 가장 간단한 편지를 만들어 봅시다.
박스
function Box(data) {
return {
map(fn) {
return Box(fn(data));
}
}
}
여기서 무슨 일이 일어났습니까?좋습니다. Box
값을 저장하는 데 사용되는 data
값을 만들었습니다. 이 값을 얻는 유일한 방법은 map
방법을 통과하는 것입니다.이 map
물건은 함수fn
를 매개 변수로 하고 이 함수를 data
에 응용하여 결과를 다른 Box
에 되돌려보낸다.나는 반드시 너희들에게 모든 편지가 이런 것은 아니지만, 전반적으로 말하자면, 그것들은 모두 이런 모델을 따른다고 말해야 한다.사용합시다.const xbox = Box('x');
const to_uppercase = (str) => str.toUpperCase();
xbox.map(to_uppercase).map(console.log);
// => X
// => Object { map: map() }
그래서 Box
보아하니 음...쓸모없다네, 일부러 그런 거예요. 그런데 제 것이 아니에요. 사실은 Identity
편지예요.그것은 우리의 일상적인 인코딩에서 쓸모가 없을 수도 있지만, 교육적 목적으로 매우 매력적이다.이 편지들의 장점은 무엇입니까?이 미세한 추상층을 추가함으로써 우리는'효과'를 순수한 계산에서 분리할 수 있다.이 점을 설명하기 위해서 우리는 실제 용도가 있는 편지를 보았다.
낯익은 얼굴
아시거나 모르실 수도 있지만, 진열은 제가 기술한 패턴을 따릅니다.이거 봐.
const xbox = ['x'];
const to_uppercase = (str) => str.toUpperCase();
xbox.map(to_uppercase);
// => Array [ "X" ]
이 수조는 하나의 용기로 Box
방법으로 우리가 내부에 가지고 있는 값을 변환할 수 있으며, 변환된 값은 다시 새로운 수조에 포장할 수 있다.네, 좋아요. 그런데 수조의'효과'는 뭐예요?그것들은 하나의 구조에 여러 개의 값을 저장할 수 있게 한다. 이것이 바로 그것들이 한 것이다.
map
특히 리셋 함수가 그룹의 모든 값에 적용되는지 확인해야 한다.그룹에 100개의 항목이 있든 없든 Array.map
처리 처리는 언제 리셋 함수의 논리를 적용하는지 확인하여 값을 어떻게 처리하는지 알 수 있습니다.물론, 당신은 편지로 더 많은 일을 할 수 있습니다. 예를 들어 오류 처리나 빈 검사, 심지어 비동기적인 작업도 편지로 모형을 만들 수 있습니다.지금, 나는 이 문제를 계속 토론하고 싶지만, 우리는 반드시 리스트의 정의로 돌아가야 한다.
뾰족한 부분
그래서 우리는 우리의 편지가 가리키는 것을 필요로 한다.이것은 편지의 가장 간단한 단원에 어떤 값을 넣을 수 있는 보조 함수가 필요하다는 것을 알려주는 기이한 방식이다.이 함수는'pure'라고 하는데 다른 이름은'unit'와'of'를 포함합니다.
우리 수조를 다시 한 번 봅시다.만약 우리가 하나의 값을 수조의 가장 간단한 단위에 넣는다면, 우리는 무엇을 얻을 수 있습니까?네, 한 항목만 있는 그룹입니다.흥미로운 것은 이것이 내장 함수가 있다는 것이다.
Array.of('No way');
// => Array [ "No way" ]
Array.of(42);
// => Array [ 42 ]
Array.of(null);
// => Array [ null ]
만약 편지를 만드는 정상적인 방식이 좀 복잡하다면, 이 보조 함수는 특히 유용하다.이 함수를 사용하면 원하는 값을 포장하고 바로 .map
ping을 시작할 수 있습니다.좋아요.더 많지만 중요한 생각이다.우리 계속 전진합시다.평원에 들어가다
이제 우리는 문제의 핵심에 들어갔다.기다리다도대체 무슨 문제야?
이런 상황을 상상해 보면 우리는 a
.map
에 숫자가 하나 있는데 Box
로 map
라는 함수를 응용하고 싶다.이런 거.const number = Box(41);
const action = (number) => Box(number + 1);
const result = number.map(action);
모든 것이 좋은 것 같다. action
다른 action
로 돌아갈 때까지.그래서 Box
실제로는 다른 result
내부의 Box
: Box
.지금 새로운 가치를 얻기 위해서 너는 반드시 이렇게 해야 한다.result.map((box) => box.map((value) => {/* Do stuff */}));
이거 큰일났다.아무도 이런 데이터를 처리하고 싶지 않다.이곳은 명세서가 우리를 도울 수 있는 곳이다.그것들은 이런 불필요한 끼워 넣는 층을 통합시키는 능력을 가진 편지이다.우리의 예에서, 그것은 Box(Box(42))
을 Box(Box(42))
로 바꿀 수 있다.어떻게Box(42)
라는 방법을 빌리다.이것이 바로 우리
join
의 상황이다. function Box(data) {
return {
map(fn) {
return Box(fn(data));
},
+ join() {
+ return data;
+ }
}
}
나는 네가 무슨 생각을 하는지 안다. 보아하니 나는 아무것도 가입하고 싶지 않은 것 같다.너는 심지어 나에게 이름을'extract'로 바꾸라고 건의할 수도 있다.거기서 기다려.예시로 돌아가서 복구하겠습니다.const result = number.map(action).join();
Ta da!지금 우리는 하나Box
를 얻었다. 우리는 하나action
만 있으면 우리가 원하는 값을 얻을 수 있다.오, 제발, 아직도 나를 보고 있니?좋아, 내가 이름을 Box(42)
로 바꾼다고 가정하면 지금은 이렇다.const result = number.map(action).extract();
문제는 내가 이 줄을 단독으로 읽으면 map
'정상'값으로 자유롭게 사용할 수 있기를 바란다는 것이다.내가 어쩔 수 없이 extract
하나를 처리해야 한다는 것을 발견했을 때, 나는 약간 낙담할 것이다.다른 한편, 만약에 내가 result
를 읽는다면, 나는 Box
가 여전히 리스트라는 것을 안다. 나는 이를 위해 준비할 수 있다."그래, 알았어. 그런데 너 그거 알아? 난 자바스크립트를 써. 난 이 편지들을 소홀히 할 뿐이야. 난 리스트가 필요 없어."완전히 옳으니, 너는 이렇게 할 수 있다.나쁜 소식은 수조가 편지이기 때문에 너는 그것들을 탈출할 수 없다.좋은 소식은 수조가 단자이기 때문에 이런 플러그인 구조의 상황을 만났을 때 쉽게 복구할 수 있다는 것이다.
그래서 수조는
join
방법이 없다...내 말은 그들이 있다는 것이지만, 그것은 result
라고 한다.보다[[41], [42]].flat();
// => Array [ 41, 42 ]
자, 전화join
를 한 후에 당신은 어떤 추가 장애도 걱정하지 않고 계속 앞으로 나아갈 수 있습니다.바로 이렇다. 실천에서 이것이 바로 쪽지의 본질과 그것들이 해결하는 문제이다.내가 가기 전에 나는 한 가지 더 이야기해야 한다.
체인의 시트
사실이 증명하듯이
flat
의 이런 조합은 매우 흔한데 실제로 이 두 가지 특징을 결합시키는 방법이 있다.이것은 야외에서도 여러 개의 이름이 있다. "chain", "flatMap", "bind", ">="(haskell에서)수조는 특히 flat
라고 부른다.const split = str => str.split('/');
['some/stuff', 'another/thing'].flatMap(split);
// => Array(4) [ "some", "stuff", "another", "thing" ]
이게 얼마나 멋있어?대신에 두 개의 끼워 넣은 수조를 포함하는 수조인데, 우리는 단지 하나의 큰 수조만 있다.이것은 끼워 넣는 구조보다 처리하기 쉽다.하지만 키 횟수를 절약할 수 있을 뿐만 아니라
map/join
처럼 함수 조합을 장려할 수 있습니다.너는 이렇게 할 수 있다.monad.flatMap(action)
.map(another)
.map(cool)
.flatMap(getItNow);
나는 네가 반드시 수조로 이 일을 해야 한다고 말한 것이 아니다.내 말은 네가 직접 리스트를 만들면 이런 스타일로 함수를 조합할 수 있다는 것이다.함수가 필요한 목록 flatMap
을 되돌려주고 되돌려주지 않으면 map
을 사용하십시오.결론
우리는 명세서가 단지 추가 특성을 가진 편지일 뿐이라는 것을 알게 되었다.다시 말하면, 그것들은 신기한 용기이다...안에 다른 용기 넣는 거 싫어요?다시 한 번 시도해 봅시다. 그들은 신기한 양파와...괜찮아, 신기해, 이렇게 하자.
일반 값에 효과를 추가하는 데 사용할 수 있습니다.따라서 우리는 그것들을 오류 처리, 비동기 조작, 부작용 처리 및 기타 많은 일에 사용할 수 있다.
우리는 또 네가 그들을 사랑하든지 미워하든지 둘 사이에는 아무것도 없다는 것을 알게 되었다.
출처
Reference
이 문제에 관하여(쪽지 소개 (js)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/vonheikemen/an-introduction-to-monads-in-js-2f7d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)