Nest.JS | Mônadas -> Lista

Jan 27 2023
A mônada List, também conhecida como mônada Array, é uma mônada usada para representar cálculos que podem ter vários resultados possíveis. É uma mônada que envolve um array e permite que você use os métodos monádicos como map, chain, flatMap, etc.

A Listmônada, também conhecida como Arraymônada, é uma mônada usada para representar cálculos que podem ter vários resultados possíveis. É uma mônada que envolve um array e permite que você use os métodos monádicos como map, chain, flatMap, etc. no array.

A Listmônada é normalmente implementada como um objeto que possui um único método flatMapque aplica uma função a cada elemento de um array e concatena os resultados.

Aqui está um exemplo da Listmônada em 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]

Por exemplo, você pode criar um Listque envolva uma matriz de números e, em seguida, usar o flatMapmétodo para aplicar uma função a cada elemento da matriz e concatenar os resultados. Você poderia encadear vários desses cálculos juntos para criar um cálculo mais complexo.

Aqui está um exemplo de como você pode usar o ListMonad no 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);
  }
}

Você pode encadear vários cálculos usando os métodos .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 observar que este exemplo é básico e não demonstra todo o poder das Mônadas na programação funcional. As mônadas podem ser usadas para lidar com vários casos, como tratamento de erros, encadeamento de vários cálculos e muito mais. É melhor entender o problema e os casos de uso antes de aplicar as mônadas.

Lista de peças: