Nest.JS | Monades -> Liste

Jan 27 2023
La monade List, également connue sous le nom de monade Array, est une monade utilisée pour représenter des calculs pouvant avoir plusieurs résultats possibles. C'est une monade qui enveloppe un tableau et vous permet d'utiliser les méthodes monadiques telles que map, chain, flatMap, etc.

La Listmonade, également connue sous le nom de Arraymonade, est une monade utilisée pour représenter des calculs pouvant avoir plusieurs résultats possibles. C'est une monade qui encapsule un tableau et vous permet d'utiliser les méthodes monadiques telles que map, chain, flatMap, etc. sur le tableau.

La Listmonade est généralement implémentée comme un objet qui a une seule méthode flatMapqui applique une fonction à chaque élément d'un tableau et concatène les résultats.

Voici un exemple de Listmonade en JavaScript :

class List {
  constructor(values) {
    this.values = values;
  }
  flatMap(f) {
    return new List(this.values.reduce((acc, x) => acc.concat(f(x)), []));
  }
}

const list = new List([1, 2, 3]);
const result = list.flatMap(x => [x * 2, x * 3]);
console.log(result.values); // [2, 3, 4, 6, 6, 9]

Par exemple, vous pouvez créer un Listqui encapsule un tableau de nombres, puis utiliser la flatMapméthode pour appliquer une fonction à chaque élément du tableau et concaténer les résultats. Vous pouvez ensuite enchaîner plusieurs de ces calculs pour créer un calcul plus complexe.

Voici un exemple d'utilisation de ListMonad dans Nest.js :

import { Injectable } from '@nestjs/common';
import { List } from 'fp-ts/lib/List';

@Injectable()
export class MyService {
  public async getUsers(): Promise<List<User>> {
    const users = await this.userRepository.find();
    return List.fromArray(users);
  }

  public async getUserById(id: string): Promise<List<User>> {
    const user = await this.userRepository.findOne(id);
    return List.of(user);
  }
}

Vous pouvez enchaîner plusieurs calculs à l'aide des méthodes .map(), .filter(), .reduce().

myService.getUsers()
  .map(users => users.filter(user => user.age > 18))
  .map(users => users.map(user => user.name))
  .map(users => users.reduce((acc, curr) => acc + ', ' + curr))
  .fold(error => console.log(error), result => console.log(result))

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 :