Nest.JS | Monaden -> Staat

Jan 27 2023
Die State-Monade ist ein funktionales Programmierkonzept, das es Ihnen ermöglicht, den Zustand auf funktionale, unveränderliche Weise zu verwalten. Sie können damit Code schreiben, der den Status einer Berechnung auf reine, zusammensetzbare Weise aktualisiert, was das Nachdenken und Testen erleichtert.

Die State-Monade ist ein funktionales Programmierkonzept, das es Ihnen ermöglicht, den Zustand auf funktionale, unveränderliche Weise zu verwalten. Sie können damit Code schreiben, der den Status einer Berechnung auf reine, zusammensetzbare Weise aktualisiert, was das Nachdenken und Testen erleichtert.

Die State-Monade wird häufig verwendet, um zustandsbehaftete Berechnungen in einer funktionalen Programmiersprache wie JavaScript zu verwalten. Mit der State-Monade können Sie eine Berechnung beschreiben, die einen Zustand auf reine, zusammensetzbare Weise aktualisiert, was es einfacher macht, über Ihren Code nachzudenken und ihn zu testen.

Eine Zustandsmonade wird normalerweise als Objekt implementiert, das über eine einzelne Methode namens verfügt run, die den Anfangszustand als Eingabe verwendet und das Ergebnis der Berechnung und den aktualisierten Zustand zurückgibt. Die Zustandsmonade kann verwendet werden, um mehrere Berechnungen miteinander zu verketten, die denselben Zustand aktualisieren und komplexere Berechnungen erstellen.

Hier ist ein Beispiel für die State-Monade in JavaScript:

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);
    });
  }
  // ...
}

Sie könnten beispielsweise einen Status erstellen, der eine Anfangszahl annimmt und eine um eins erhöhte neue Zahl zurückgibt. Anschließend könnten Sie mehrere dieser Status miteinander verketten, um eine komplexere Berechnung zu erstellen, die den Status mehrmals aktualisiert, ohne den Status manuell übergeben zu müssen Zustand durch jeden Schritt.

Es ist wichtig zu beachten, dass die State Monad kein übliches Muster in JavaScript ist, sondern hauptsächlich in funktionalen Programmiersprachen wie Haskell, Scala usw. verwendet wird.

StateHier ist ein Beispiel dafür, wie Sie die Monade in Nest.js verwenden können :

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);
  }
}

Die StateMonade wird verwendet, um den Status auf funktionale Weise zu verwalten. In diesem Beispiel wird ein einfacher Zähler als Status verwendet, der Status kann jedoch auch ein Objekt oder ein Array sein.

Die incrementCounter()Methode erhöht den Zähler und aktualisiert den Status, die decrementCounter()Methode dekrementiert den Zähler und aktualisiert den Status, die getCounter()Methode gibt den aktuellen Zählerwert zurück.

Sie können mehrere Berechnungen mit den Methoden .map(), .chain(), verketten .ap().

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

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

Es ist wichtig zu beachten, dass es sich bei diesem Beispiel um ein einfaches Beispiel handelt und nicht die volle Leistungsfähigkeit von Monaden in der funktionalen Programmierung demonstriert. Monaden können verwendet werden, um verschiedene Fälle wie Fehlerbehandlung, Verkettung mehrerer Berechnungen und mehr zu behandeln. Es ist am besten, das Problem und die Anwendungsfälle zu verstehen, bevor Sie Monaden anwenden.

Außerdem run()muss die Methode aufgerufen werden, um die Zustandsmonade auszuführen und die Ergebnisse zu erhalten. Sie benötigt einen Anfangszustand als Argument.

Teileliste: