Nest.JS | Monades -> Soit

Jan 27 2023
La monade Soit, également connue sous le nom de monade de résultat, est une monade qui est utilisée pour représenter des calculs qui peuvent avoir l'un des deux résultats possibles : une valeur de type Left ou une valeur de type Right. Le type Left est généralement utilisé pour représenter une erreur ou un échec, tandis que le type Right est utilisé pour représenter un calcul réussi.

La Eithermonade, également connue sous le nom de Resultmonade, est une monade utilisée pour représenter des calculs pouvant avoir l'un des deux résultats possibles : une valeur de type Leftou une valeur de type Right. Le Lefttype est généralement utilisé pour représenter une erreur ou un échec, tandis que le Righttype est utilisé pour représenter un calcul réussi.

La Eithermonade est généralement implémentée comme un objet qui a deux sous-types : Leftet Right. Le Leftsous-type contient une valeur d'erreur, tandis que le Rightsous-type contient une valeur réussie.

Voici un exemple de Eithermonade en 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;
  }
}

Par exemple, vous pouvez créer un Rightqui encapsule un nombre, puis utiliser la mapméthode pour incrémenter ce nombre, ou vous pouvez créer un Leftqui encapsule un message d'erreur, puis utiliser la getOrElseméthode pour gérer l'erreur. RightVous pouvez ensuite en chaîner plusieurs Leftpour créer un calcul plus complexe, sans avoir à vérifier manuellement la présence d'une valeur ou d'une erreur à chaque étape.

Dans Nest.js, le EitherMonad est un Monad qui vous permet de gérer les erreurs et de renvoyer des valeurs de manière fonctionnelle. Il peut être utilisé pour représenter le résultat d'un calcul qui peut être soit un succès (une valeur de droite), soit un échec (une valeur de gauche).

Voici un exemple d'utilisation de EitherMonad dans 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'));
    }
  }
}

Vous pouvez utiliser la .fold()méthode pour attacher une fonction de rappel qui sera invoquée avec la valeur de EitherMonad.

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

Il est important de noter que cet exemple est basique et ne démontre pas toute la puissance de Monads dans la programmation fonctionnelle. Les monades peuvent être utilisées pour gérer divers cas comme la gestion des erreurs, l'enchaînement de plusieurs calculs et plus encore, il est préférable de comprendre le problème et les cas d'utilisation avant d'appliquer les monades.

Liste des pièces :