Nido.JS | Mónadas -> IO

Jan 27 2023
La mónada IO, también conocida como “mónada de entrada/salida”, es un concepto de programación funcional que le permite separar la descripción de una operación de entrada/salida de su ejecución. En otras palabras, le permite definir un cálculo que realiza alguna acción de E/S (como leer de un archivo o interactuar con una base de datos) sin realizar realmente esa acción hasta que se invoque explícitamente.

La mónada IO, también conocida como “mónada de entrada/salida”, es un concepto de programación funcional que le permite separar la descripción de una operación de entrada/salida de su ejecución. En otras palabras, le permite definir un cálculo que realiza alguna acción de E/S (como leer de un archivo o interactuar con una base de datos) sin realizar realmente esa acción hasta que se invoque explícitamente.

La mónada IO se usa a menudo para gestionar los efectos secundarios en un lenguaje de programación funcional, como JavaScript. La mónada IO le permite describir un cálculo efectivo de una manera pura y componible, lo que facilita el razonamiento y la prueba de su código.

Una mónada de E/S normalmente se implementa como un objeto que tiene un solo método, llamado run, que realiza la acción de E/S y devuelve el resultado. La mónada de E/S se puede utilizar para encadenar varias operaciones de E/S y crear cálculos más complejos.

Aquí hay un ejemplo de la mónada IO en 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));
  }
}

Puede encadenar varios cálculos utilizando los 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()

Es importante tener en cuenta que este ejemplo es básico y no demuestra todo el poder de Monads en la programación funcional. Las mónadas se pueden usar para manejar varios casos, como el manejo de errores, el encadenamiento de múltiples cálculos y más. Es mejor comprender el problema y los casos de uso antes de aplicar las mónadas.

Además, run()se debe llamar al método para ejecutar IO Monad y obtener los resultados, esto se conoce porque impuredepende del estado/contexto externo, IO Monads se utilizan para separar el código impuro del código puro para una mejor organización del código. y pruebas

Lista de piezas: