Nest.JS | 모나드 -> 상태

Jan 27 2023
State 모나드는 기능적이고 변경 불가능한 방식으로 상태를 관리할 수 있게 해주는 기능적 프로그래밍 개념입니다. 순수하고 구성 가능한 방식으로 계산 상태를 업데이트하는 코드를 작성할 수 있으므로 더 쉽게 추론하고 테스트할 수 있습니다.

State 모나드는 기능적이고 변경 불가능한 방식으로 상태를 관리할 수 있게 해주는 기능적 프로그래밍 개념입니다. 순수하고 구성 가능한 방식으로 계산 상태를 업데이트하는 코드를 작성할 수 있으므로 더 쉽게 추론하고 테스트할 수 있습니다.

State 모나드는 종종 JavaScript와 같은 기능적 프로그래밍 언어에서 상태 저장 계산을 관리하는 데 사용됩니다. State 모나드를 사용하면 순수하고 구성 가능한 방식으로 일부 상태를 업데이트하는 계산을 설명할 수 있으므로 코드를 더 쉽게 추론하고 테스트할 수 있습니다.

runState 모나드는 일반적 으로 초기 상태를 입력으로 받아 계산 결과와 업데이트된 상태를 반환하는 이라는 단일 메서드가 있는 객체로 구현됩니다 . State 모나드는 동일한 상태를 업데이트하고 더 복잡한 계산을 생성하는 여러 계산을 함께 연결하는 데 사용할 수 있습니다.

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

class State {
  constructor(fn) {
    this.run = fn
  }
  map(f) {
    return new State((state) => {
        const [result, updatedState] = this.run(state);
        return [f(result), updatedState];
    });
  }
  chain(f) {
    return new State((state) => {
        const [result, updatedState] = this.run(state);
        return f(result).run(updatedState);
    });
  }
  // ...
}

예를 들어 초기 숫자를 사용하여 1씩 증가한 새 숫자를 반환하는 State를 생성할 수 있습니다. 그런 다음 이러한 여러 State를 함께 연결하여 수동으로 각 단계를 통해 상태.

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

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

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

interface StateType {
  counter: number;
}

@Injectable()
export class MyService {
  public incrementCounter(): State<StateType, number> {
    return state.get().map(s => s.counter + 1).put({ counter: s.counter + 1 });
  }

  public decrementCounter(): State<StateType, number> {
    return state.get().map(s => s.counter - 1).put({ counter: s.counter - 1 });
  }

  public getCounter(): State<StateType, number> {
    return state.get().map(s => s.counter);
  }
}

모나드 State는 기능적인 방식으로 상태를 관리하는 데 사용됩니다. 이 예제에서는 간단한 카운터를 상태로 사용하지만 상태는 객체나 배열과 같은 것이 될 수 있습니다.

메서드 incrementCounter()는 카운터를 증가시키고 상태를 업데이트하고, decrementCounter()메서드는 카운터를 감소시키고 상태를 업데이트하고, getCounter()메서드는 현재 카운터 값을 반환합니다.

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

const program: State<StateType, number> = myService
  .incrementCounter()
  .chain(() => myService.incrementCounter())
  .chain(() => myService.getCounter());

console.log(program.run({ counter: 0 }).value);

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

또한 run()State Monad를 실행하고 결과를 얻으려면 메서드를 호출해야 하며 초기 상태를 인수로 사용합니다.

부품 목록: