Nest.JS | 모나드 -> 리더

Jan 27 2023
"Environment monad"라고도 하는 Reader 모나드는 컴퓨팅 전체에서 환경 또는 공유 컨텍스트를 전달할 수 있는 함수형 프로그래밍 개념입니다. 이를 통해 해당 컨텍스트의 특정 값과 독립적인 코드를 작성할 수 있으므로 더 쉽게 재사용하고 테스트할 수 있습니다.

"Environment monad"라고도 하는 Reader 모나드는 컴퓨팅 전체에서 환경 또는 공유 컨텍스트를 전달할 수 있는 함수형 프로그래밍 개념입니다. 이를 통해 해당 컨텍스트의 특정 값과 독립적인 코드를 작성할 수 있으므로 더 쉽게 재사용하고 테스트할 수 있습니다.

Reader 모나드는 종종 JavaScript와 같은 기능적 프로그래밍 언어에서 종속성과 구성 값을 관리하는 데 사용됩니다. Reader 모나드를 사용하면 일부 외부 컨텍스트에 의존하는 계산을 순수하고 구성 가능한 방식으로 설명할 수 있으므로 코드를 더 쉽게 추론하고 테스트할 수 있습니다.

runReader 모나드는 일반적 으로 컨텍스트를 입력으로 사용하고 계산 결과를 반환하는 이라는 단일 메서드가 있는 객체로 구현됩니다 . Reader 모나드는 동일한 컨텍스트에 의존하고 더 복잡한 계산을 생성하는 여러 계산을 함께 연결하는 데 사용할 수 있습니다.

다음은 JavaScript에서 Reader 모나드의 예입니다.

class Reader {
  constructor(fn) {
    this.run = fn
  }
  map(f) {
    return new Reader(e => f(this.run(e)))
  }
  chain(f) {
    return new Reader(e => f(this.run(e)).run(e))
  }
  // ...
}

예를 들어 구성 개체를 가져와 해당 구성에 따라 값을 반환하는 Reader를 만들 수 있습니다. 그런 다음 각 단계를 통해 구성 개체를 전달하지 않고도 이러한 판독기 여러 개를 함께 연결하여 더 복잡한 계산을 만들 수 있습니다.

Reader Monad는 JavaScript에서 일반적인 패턴이 아니며 주로 Haskell, scala 등과 같은 기능적 프로그래밍 언어에서 사용된다는 점에 유의해야 합니다.

Reader다음은 Nest.js에서 모나드를 사용하는 방법의 예입니다 .

import { Injectable } from '@nestjs/common';
import { Reader, reader } from 'fp-ts/lib/Reader';

@Injectable()
export class MyService {
  public incrementCounter(counter: number): Reader<number, number> {
    return reader.of(counter + 1);
  }

  public decrementCounter(counter: number): Reader<number, number> {
    return reader.of(counter - 1);
  }

  public getCounter(counter: number): Reader<number, number> {
    return reader.of(counter);
  }
}

Monad Reader는 프로그램이나 함수 집합 전체에서 구성, 종속성 또는 컨텍스트의 전달을 추상화하는 데 사용됩니다.

이 예제에서 incrementCounter()메서드는 카운터를 증가시키고 새 값을 반환하고, decrementCounter()메서드는 카운터를 감소시키고 새 값을 반환하고, getCounter()메서드는 현재 카운터 값을 반환합니다.

.map(), .chain(), 메서드를 사용하여 여러 계산을 연결할 수 있습니다 .ap().

const program: Reader<number, number> = myService
  .incrementCounter(10)
  .chain(counter => myService.decrementCounter(counter))
  .chain(counter => myService.getCounter(counter));

console.log(program.run());

이 예제는 기본 예제이며 함수형 프로그래밍에서 모나드의 모든 기능을 보여주지 않는다는 점에 유의해야 합니다. 모나드는 오류 처리, 여러 계산 연결 등과 같은 다양한 경우를 처리하는 데 사용할 수 있습니다. 모나드를 적용하기 전에 문제와 사용 사례를 이해하는 것이 가장 좋습니다.

또한 run()Reader Monad를 실행하고 결과를 얻으려면 메소드를 호출해야 하며 환경을 인수로 사용합니다.

부품 목록: