Nest.JS | Monadi -> Lettore
La monade del lettore, nota anche come "monade dell'ambiente", è un concetto di programmazione funzionale che consente di passare un ambiente, o un contesto condiviso, attraverso un calcolo. Ti consente di scrivere codice indipendente dai valori specifici di quel contesto, rendendolo più riutilizzabile e più facile da testare.
La monade Reader viene spesso utilizzata per gestire dipendenze e valori di configurazione in un linguaggio di programmazione funzionale, come JavaScript. La monade Reader ti consente di descrivere un calcolo che dipende da un contesto esterno in un modo puro e componibile, il che rende più facile ragionare e testare il tuo codice.
Una monade Reader è tipicamente implementata come un oggetto che ha un singolo metodo, chiamato run, che accetta il contesto come input e restituisce il risultato del calcolo. La monade Reader può essere utilizzata per concatenare più calcoli che dipendono dallo stesso contesto e creare calcoli più complessi.
Ecco un esempio della monade Reader in JavaScript:
class Reader {
constructor(fn) {
this.run = fn
}
map(f) {
return new Reader(e => f(this.run(e)))
}
chain(f) {
return new Reader(e => f(this.run(e)).run(e))
}
// ...
}
Ad esempio, puoi creare un Reader che accetta un oggetto di configurazione e restituisce un valore basato su tale configurazione. È quindi possibile concatenare più di questi lettori insieme per creare un calcolo più complesso, senza dover passare l'oggetto di configurazione attraverso ogni passaggio.
È importante notare che Reader Monad non è un modello comune in JavaScript, è utilizzato principalmente in linguaggi di programmazione funzionale come Haskell, scala, ecc.
Ecco un esempio di come potresti utilizzare ReaderMonad in Nest.js:
import { Injectable } from '@nestjs/common';
import { Reader, reader } from 'fp-ts/lib/Reader';
@Injectable()
export class MyService {
public incrementCounter(counter: number): Reader<number, number> {
return reader.of(counter + 1);
}
public decrementCounter(counter: number): Reader<number, number> {
return reader.of(counter - 1);
}
public getCounter(counter: number): Reader<number, number> {
return reader.of(counter);
}
}
La Readermonade viene utilizzata per astrarre il passaggio di configurazione, dipendenze o contesto attraverso un programma o un insieme di funzioni.
In questo esempio, il incrementCounter()metodo incrementa il contatore e restituisce un nuovo valore, il decrementCounter()metodo decrementa il contatore e restituisce un nuovo valore, il getCounter()metodo restituisce il valore corrente del contatore.
È possibile concatenare più calcoli utilizzando i metodi .map(), .chain(), .ap().
const program: Reader<number, number> = myService
.incrementCounter(10)
.chain(counter => myService.decrementCounter(counter))
.chain(counter => myService.getCounter(counter));
console.log(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 Reader Monad e ottenere i risultati, prende l'ambiente come argomento.
Elenco delle parti:

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



































