Nest.JS | Monaden -> Reader

Jan 27 2023
Die Reader-Monade, auch bekannt als „Umgebungsmonade“, ist ein funktionales Programmierkonzept, das es Ihnen ermöglicht, während einer Berechnung eine Umgebung oder einen gemeinsamen Kontext zu übergeben. Sie können damit Code schreiben, der unabhängig von den spezifischen Werten dieses Kontexts ist, wodurch er wiederverwendbar und einfacher zu testen ist.

Die Reader-Monade, auch bekannt als „Umgebungsmonade“, ist ein funktionales Programmierkonzept, das es Ihnen ermöglicht, während einer Berechnung eine Umgebung oder einen gemeinsamen Kontext zu übergeben. Sie können damit Code schreiben, der unabhängig von den spezifischen Werten dieses Kontexts ist, wodurch er wiederverwendbar und einfacher zu testen ist.

Die Reader-Monade wird häufig zum Verwalten von Abhängigkeiten und Konfigurationswerten in einer funktionalen Programmiersprache wie JavaScript verwendet. Mit der Reader-Monade können Sie eine Berechnung, die von einem externen Kontext abhängt, auf reine, zusammensetzbare Weise beschreiben, was es einfacher macht, über Ihren Code nachzudenken und ihn zu testen.

Eine Reader-Monade wird normalerweise als Objekt implementiert, das über eine einzelne Methode namens verfügt run, die den Kontext als Eingabe verwendet und das Ergebnis der Berechnung zurückgibt. Die Reader-Monade kann verwendet werden, um mehrere Berechnungen, die vom gleichen Kontext abhängen, miteinander zu verketten und komplexere Berechnungen zu erstellen.

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

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

Sie könnten beispielsweise einen Reader erstellen, der ein Konfigurationsobjekt übernimmt und einen auf dieser Konfiguration basierenden Wert zurückgibt. Sie könnten dann mehrere dieser Reader miteinander verketten, um eine komplexere Berechnung zu erstellen, ohne das Konfigurationsobjekt durch jeden Schritt weiterleiten zu müssen.

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

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

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

Die ReaderMonade wird verwendet, um die Weitergabe von Konfigurationen, Abhängigkeiten oder Kontexten in einem Programm oder einer Reihe von Funktionen zu abstrahieren.

In diesem Beispiel incrementCounter()erhöht die Methode den Zähler und gibt einen neuen Wert zurück, die decrementCounter()Methode dekrementiert den Zähler und gibt einen neuen Wert zurück, die getCounter()Methode gibt den aktuellen Zählerwert zurück.

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

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

console.log(program.run());

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 Reader-Monade auszuführen und die Ergebnisse zu erhalten. Sie verwendet die Umgebung als Argument.

Teileliste: