Nest.JS | Monadi -> Entrambi

Jan 27 2023
La monade Entrambi, nota anche come monade Risultato, è una monade utilizzata per rappresentare calcoli che possono avere uno dei due possibili risultati: un valore di tipo Left o un valore di tipo Right. Il tipo Left viene in genere utilizzato per rappresentare un errore o un errore, mentre il tipo Right viene utilizzato per rappresentare un calcolo riuscito.

La Eithermonade, nota anche come Resultmonade, è una monade utilizzata per rappresentare calcoli che possono avere uno dei due possibili risultati: un valore di type Lefto un valore di type Right. Il Lefttipo viene in genere utilizzato per rappresentare un errore o un errore, mentre il Righttipo viene utilizzato per rappresentare un calcolo riuscito.

La Eithermonade è tipicamente implementata come un oggetto che ha due sottotipi: Lefte Right. Il Leftsottotipo contiene un valore di errore, mentre il Rightsottotipo contiene un valore di successo.

Ecco un esempio della Eithermonade in JavaScript:

class Left {
  constructor(value) {
    this.value = value;
  }
  map(f) {
    return this;
  }
  chain(f) {
    return this;
  }
  getOrElse(defaultValue) {
    return defaultValue;
  }
}

class Right {
  constructor(value) {
    this.value = value;
  }
  map(f) {
    return new Right(f(this.value));
  }
  chain(f) {
    return f(this.value);
  }
  getOrElse(defaultValue) {
    return this.value;
  }
}

Ad esempio, è possibile creare un Rightmessaggio che racchiude un numero e quindi utilizzare il mapmetodo per incrementare tale numero oppure creare un Leftmessaggio di errore che racchiude un messaggio di errore e quindi utilizzare il getOrElsemetodo per gestire l'errore. È quindi possibile concatenare più di questi Righte Leftinsieme per creare un calcolo più complesso, senza dover verificare manualmente la presenza di un valore o di un errore a ogni passaggio.

In Nest.js, EitherMonad è una monade che consente di gestire gli errori e restituire i valori in modo funzionale. Può essere utilizzato per rappresentare il risultato di un calcolo che può essere un successo (un valore corretto) o un fallimento (un valore sinistro).

Ecco un esempio di come potresti utilizzare EitherMonad in Nest.js:

import { Injectable } from '@nestjs/common';
import { Either, left, right } from 'fp-ts/lib/Either';

@Injectable()
export class MyService {
  public findUserById(id: number): Either<Error, User> {
    const user = findUserInDB(id);
    if (user) {
      return right(user);
    } else {
      return left(new Error('User not found'));
    }
  }
}

È possibile utilizzare il .fold()metodo per allegare una funzione di callback che verrà richiamata con il valore di EitherMonad.

myService.findUserById(1)
        .fold(error => console.log(error), user => console.log(user))

È importante notare che questo esempio è di base e non dimostra tutta la potenza di Monads nella programmazione funzionale. Le monadi possono essere utilizzate per gestire vari casi come la gestione degli errori, il concatenamento di più calcoli e altro ancora, è meglio comprendere il problema e i casi d'uso prima di applicare le monadi.

Elenco delle parti: