Nest.JS | 모나드 -> 상태
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를 실행하고 결과를 얻으려면 메서드를 호출해야 하며 초기 상태를 인수로 사용합니다.
부품 목록:

![연결된 목록이란 무엇입니까? [1 부]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































