Nest.JS | Monadi -> IO
La monade IO, nota anche come "monade di input/output", è un concetto di programmazione funzionale che consente di separare la descrizione di un'operazione di input/output dalla sua esecuzione. In altre parole, consente di definire un calcolo che esegue un'azione di I/O (come la lettura da un file o l'interazione con un database) senza eseguire effettivamente quell'azione finché non viene invocata esplicitamente.
La monade IO viene spesso utilizzata per gestire gli effetti collaterali in un linguaggio di programmazione funzionale, come JavaScript. La monade IO ti consente di descrivere un calcolo efficace in un modo puro e componibile, il che rende più facile ragionare e testare il tuo codice.
Una monade IO è tipicamente implementata come un oggetto che ha un singolo metodo, chiamato run, che esegue l'azione I/O e restituisce il risultato. La monade IO può essere utilizzata per concatenare più operazioni di I/O e creare calcoli più complessi.
Ecco un esempio della monade IO in 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));
}
}
È possibile concatenare più calcoli utilizzando i metodi .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 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.
Inoltre, il run()metodo deve essere chiamato per eseguire IO Monad e ottenere i risultati, questo è noto perché impuredipende dallo stato/contesto esterno, IO Monads viene utilizzato per separare il codice impuro dal codice puro per una migliore organizzazione del codice e test.
Elenco delle parti:

![Che cos'è un elenco collegato, comunque? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































