Nest.JS | Monadi -> Elenco

Jan 27 2023
La monade List, nota anche come monade Array, è una monade utilizzata per rappresentare calcoli che possono avere più risultati possibili. È una monade che avvolge un array e ti consente di utilizzare i metodi monadici come map, chain, flatMap, ecc.

La Listmonade, nota anche come Arraymonade, è una monade utilizzata per rappresentare calcoli che possono avere più risultati possibili. È una monade che avvolge un array e consente di utilizzare i metodi monadici come map, chain, flatMap, ecc. sull'array.

La Listmonade è tipicamente implementata come un oggetto che ha un singolo metodo flatMapche applica una funzione a ciascun elemento di un array e concatena i risultati.

Ecco un esempio della Listmonade in 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]

Ad esempio, è possibile creare un Listche avvolge un array di numeri e quindi utilizzare il flatMapmetodo per applicare una funzione a ciascun elemento dell'array e concatenare i risultati. È quindi possibile concatenare più di questi calcoli insieme per creare un calcolo più complesso.

Ecco un esempio di come potresti utilizzare ListMonad in 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);
  }
}

È possibile concatenare più calcoli utilizzando i metodi .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))

È 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: