나는 이미 pipe () 함수를 2560번 사용했다. 나는 너에게 이것이 매우 좋다고 말할 수 있다.

내가 말한 pipe() 함수는 b(a(x))pipe(x, a, b)로 바꿀 수 있는 함수이다.그래, 이것이 바로 내가 지난 몇 년 동안 그것을 사용한 횟수이다. 이러한 용법을 돌이켜 보면, 설령 네가 사용한 코드 라이브러리가 주류 모델에서 벗어나 함수식 프로그래밍에 들어가지 않았다 하더라도, 왜 그것도 매우 유용하다는 것을 발견할 수 있는지 알려주고 싶다.

어디서 왔어요?

pipe 첫 번째 매개변수를 승인하여 제공된 각 함수에 나머지 매개변수로 전달할 수 있습니다.
const pipe = (x, ...fns) => 
  fns.reduce((acc, el) => el(acc), x);
TypeScript 3.4에서 유형 추정을 통해 작업을 완벽하게 수행할 수 있으므로 다시 로드type it in TypeScript를 사용할 수 있습니다.

이 함수를 보는 방법은 제안된 파이프 운영자(x |> a |> b에 대한 충전으로 간주하는 것이다.이 건의는 이미 1단계에 처한 지 여러 해가 되었지만, 좋은 소식은 pipe 그다지 나쁘지 않다는 것이다. 이상하게도, 그것은 심지어 어떤 의미에서 논의된 조작부호의 일부 스타일보다 낫다. 즉, 파라핀에 화살표 함수를 포함할 필요가 없다는 것이다.만약 pipeline operator의 한 스타일이 정말 3단계에 이르렀다면 당신은 소외되지 않을 것입니다. AST 도구와Prettier가 있으면operator로 교체pipe된 코드mod를 구축하기 쉽습니다.
파이프 조작부호를 제외하고 pipe는 함수 조합을 하는 각종 방법 중의 첫 번째 선택으로 볼 수 있다.또 하나 언급할 만한 경쟁자는 함수인데 함수를 응용하지 않은 상황에서 함수를 조합한다.
const ltrCompose = (...fns) => (x) => 
  fns.reduce((acc, el) => fn(acc), x);
그래서 b(a(x))ltrCompose(a, b)(x)에 해당한다.이것은 고급 함수이다. 이것이 바로 pipe가 그것보다 우수한 점이다. pipe는 같은 목적을 실현할 수 있기 때문에 함수를 다른 함수로 바꾸는 것을 고려하지 않아도 된다.처음에 나는 상하문에 따라 이 두 가지 실용 프로그램을 사용하려고 시도했지만, 나는 이것이 '오직 한 가지 방법만이 할 수 있다' 는 것을 심각하게 위반한 것을 발견했다.

점사슬처럼.


이제 사용pipe의 이유를 살펴보자.먼저 주의해야 할 것은 pipe 새로운 모델을 도입하지 않고 점 링크와 기본적으로 같은 모델을 사용할 수 있도록 허용하는 것입니다.
yourArray.filter(predicate).map(project);
yourString.trim().toLowerCase();
이 컴퓨터의 대상에 대해 정의된 방법 집합에만 한정됩니다.
하나의 용례는 이러한 사실을 둘러싸고 있다. 원생 자바스크립트 API의 디자인은 우리가 오늘 자주 사용하는 변하지 않는 업데이트를 고려하지 않았다.sortArray방법과addSet방법으로 돌연변이가 발생하고 있으나pipe를 통해 우리는 그들의 비돌연변이 대응물을 정의할 수 있다.
const sort = (compare) => (array) =>
  [...array].sort(compare);

const add = (value) => (set) => 
  new Set(set).add(value);
점 체인 방법을 사용하는 것과 마찬가지로
const newArray = pipe(array, sort(compare));
const newSet = pipe(set, add(value));
또 다른 흔히 볼 수 있는 용례는iterables이다.예를 들어 필터 Map 의 값이 필요하면 쓰기 [...yourMap.values()].filter(predicate) 를 해야 한다. 다시 말하면 yourMap.values 되돌아오는 iterable를 그룹으로 바꾸어 filter 방법을 얻어야 한다.만약 성능 문제일 뿐이라면 그것도 그리 대단한 것은 아니지만, 이렇게 하면 효율이 떨어질 뿐만 아니라 코드도 뒤죽박죽이 될 것이다.pipe 스토리지와 마찬가지로 iterables를 사용하는 대체 방법을 제공합니다.
const filter = (predicate) =>
  function* (iterable) {
    for (const el of iterable) {
      if (predicate(el)) {
        yield el;
      }
    }
  };

const filteredValuesIterable = pipe(
  yourMap.values(), 
  filter(predicate)
);

표현식으로 로컬 사람을 만들 수 있습니다


이것은 pipe를 사용한 또 다른 원인이다. 이번에는 pipe 자체를 제외하고 우리는 심지어 어떠한 실용 함수도 필요하지 않다.if 자구에서 문자열을 숫자로 변환하고 0보다 큰지 확인해야 한다고 가정하십시오.
if (parseFloat(str) > 0) { 
  // ...
}
지금 만약 우리가 숫자가 1보다 작은지 확인해야 한다고 가정한다면.복제parseFloat 호출을 원하지 않는 한 외부 범위에서 새 상수를 정의해야 합니다.
const num = parseFloat(str);
if (num > 0 && num < 1) { 
  // ...
}
만약 num의 범위가 if 자구의 표현식이라면 이것이 더 좋지 않습니까? 이것은 우리가 유일하게 그것을 필요로 하는 곳입니까?이것은 생활을 통해 실현할 수 있지만 결코 아름답지 않다.
if ((() => {
  const num = parseFloat(str);
  return num > 0 && num < 1;
})()) { 
  // ...
}
pipe 이 문제를 해결했습니다.
if (pipe(str, parseFloat, (num) => num > 0 && num < 1)) { 
  // ...
}
일반적으로 표현식이 필요한 상하문에서 함수 매개 변수, 수조/대상 문자의 요소든 삼원 연산자의 조작수든 pipe 국부 표현식을 만들 수 있으며 IIFE에 호소할 필요가 없습니다.표정에 더 의존하게 되고,
const reducer = (state, action) =>
  action.type === `incrementA`
    ? pipe(state, ({ a, ...rest }) => ({ ...rest, a: a + 1 }))
    : action.type === `incrementB`
    ? pipe(state, ({ b, ...rest }) => ({ ...rest, b: b + 1 }))
    : state;
그러나 표현식pipe을 계속 사용할 필요는 없다. 표현식과 문장 사이에서만 선택할 수 있다. 문법적 제한이 아니라 특정한 상황에서 더 읽을 수 있는 내용을 바탕으로 한다.
여기에 정의된 pipe 함수는 fp-ts에서 사용할 수 있습니다.나처럼 완전한 함수 프로그래밍 라이브러리가 필요하지 않으면 내 라이브러리 Antutils에서 얻을 수 있다pipe:

ivan7237d / 항생제


TypeScript/JavaScript 유틸리티


항생제







TypeScript/JavaScript 유틸리티

  • Minimal API

  • pipe function

  • Non-mutating functions for working with objects, arrays, maps, and sets

  • Functions for working with native iterables

  • Comparison functions

  • Reducers

  • Lenses

  • Memoization utilities

  • Functions for downcasting
  • 설치하다.

    yarn add antiutils
    
    또는
    npm install antiutils --save
    

    최소 API


    이 라이브러리는 일반 JavaScript를 사용하여 특정 작업을 쉽고 쉽게 수행할 수 없는 경우에만 유틸리티를 제공합니다.예를 들어, 우리는 대상 속성 값을 얻는 함수를 제공하지 않기 때문에 get('a') 대신 value => value.a만 작성하면 된다.

    파이프 기능


    이 라이브러리는 함수 pipe 를 제공합니다. 1 ~ 12개의 매개 변수를 받아들입니다.pipe(x, a, b)b(a(x))에 해당한다. 다시 말하면 이 함수는 함수에 나타난 순서에 따라 여러 함수를 통해 값을 전달한다.

    💡 TIP

    At any point in…


    View on GitHub

    좋은 웹페이지 즐겨찾기