Nest.JS | Mônadas -> IO

Jan 27 2023
A mônada IO, também conhecida como “mônada de entrada/saída”, é um conceito de programação funcional que permite separar a descrição de uma operação de entrada/saída de sua execução. Em outras palavras, permite definir uma computação que executa alguma ação de E/S (como ler um arquivo ou interagir com um banco de dados) sem realmente executar essa ação até que seja invocada explicitamente.

A mônada IO, também conhecida como “mônada de entrada/saída”, é um conceito de programação funcional que permite separar a descrição de uma operação de entrada/saída de sua execução. Em outras palavras, permite definir uma computação que executa alguma ação de E/S (como ler um arquivo ou interagir com um banco de dados) sem realmente executar essa ação até que seja invocada explicitamente.

A mônada IO é frequentemente usada para gerenciar efeitos colaterais em uma linguagem de programação funcional, como JavaScript. A mônada IO permite que você descreva uma computação eficaz de uma maneira pura e combinável, o que torna mais fácil raciocinar e testar seu código.

Uma mônada de E/S é normalmente implementada como um objeto que possui um único método, chamado run, que executa a ação de E/S e retorna o resultado. O monad IO pode ser usado para encadear várias operações de I/O e criar cálculos mais complexos.

Aqui está um exemplo da mônada IO em JavaScript:

class IO {
  constructor(effect) {
    this.effect = effect
  }
  run() {
    return this.effect()
  }
  map(f) {
    return new IO(() => f(this.run()))
  }
  chain(f) {
    return new IO(() => f(this.run()).run())
  }
  // ...
}

import { Injectable } from '@nestjs/common';
import { IO, io } from 'fp-ts/lib/IO';

@Injectable()
export class MyService {
  public async getUsers(): IO<User[]> {
    return io.fromPromise(this.userRepository.find());
  }

  public async getUserById(id: string): IO<User> {
    return io.fromPromise(this.userRepository.findOne(id));
  }
}

Você pode encadear vários cálculos usando os métodos .map(), .chain(), .ap().

const program: IO<string> = myService.getUsers()
    .map(users => users.filter(user => user.age > 18))
    .chain(users => myService.getUserById(users[0].id))
    .map(user => user.name)

  program.run()

É 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.

Além disso, o run()método deve ser chamado para executar o IO Monad e obter os resultados, isso é conhecido como impuredepende do estado/contexto externo, IO Monads são usados ​​para separar o código impuro do código puro para melhor organização do código e testando.

Lista de peças: