쪽지 소개 (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 ]
만약 편지를 만드는 정상적인 방식이 좀 복잡하다면, 이 보조 함수는 특히 유용하다.이 함수를 사용하면 원하는 값을 포장하고 바로 .mapping을 시작할 수 있습니다.좋아요.더 많지만 중요한 생각이다.우리 계속 전진합시다.

평원에 들어가다


이제 우리는 문제의 핵심에 들어갔다.기다리다도대체 무슨 문제야?
이런 상황을 상상해 보면 우리는 a.map에 숫자가 하나 있는데 Boxmap라는 함수를 응용하고 싶다.이런 거.
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 을 사용하십시오.

결론


우리는 명세서가 단지 추가 특성을 가진 편지일 뿐이라는 것을 알게 되었다.다시 말하면, 그것들은 신기한 용기이다...안에 다른 용기 넣는 거 싫어요?다시 한 번 시도해 봅시다. 그들은 신기한 양파와...괜찮아, 신기해, 이렇게 하자.
일반 값에 효과를 추가하는 데 사용할 수 있습니다.따라서 우리는 그것들을 오류 처리, 비동기 조작, 부작용 처리 및 기타 많은 일에 사용할 수 있다.
우리는 또 네가 그들을 사랑하든지 미워하든지 둘 사이에는 아무것도 없다는 것을 알게 되었다.

출처

  • Professor Frisby's Mostly Adequate Guide to Functional Programming. Chapter 9: Monadic Onions
  • Funcadelic.js
  • Fantasy Land
  • 읽어주셔서 감사합니다.만약 당신이 이 문장이 매우 유용하다고 생각하고 나의 노력을 지지하고 싶다면, buy me a coffee ☕.

    좋은 웹페이지 즐겨찾기