쪽지 소개 (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에 숫자가 하나 있는데 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 을 사용하십시오.

결론


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

출처

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

    좋은 웹페이지 즐겨찾기