Gniazdo.JS | Monady -> Czytnik
Monada czytnika, znana również jako „monada środowiska”, to funkcjonalna koncepcja programistyczna, która umożliwia przekazywanie środowiska lub współdzielonego kontekstu podczas obliczeń. Pozwala na pisanie kodu, który jest niezależny od określonych wartości tego kontekstu, dzięki czemu jest bardziej wielokrotnego użytku i łatwiejszy do testowania.
Monada Reader jest często używana do zarządzania zależnościami i wartościami konfiguracyjnymi w funkcjonalnym języku programowania, takim jak JavaScript. Monada Reader umożliwia opisanie obliczeń, które zależą od zewnętrznego kontekstu, w czysty, komponowalny sposób, co ułatwia rozumowanie i testowanie kodu.
Monada Reader jest zwykle implementowana jako obiekt, który ma pojedynczą metodę o nazwie run, która pobiera kontekst jako dane wejściowe i zwraca wynik obliczeń. Monada Reader może służyć do łączenia wielu obliczeń, które zależą od tego samego kontekstu i tworzenia bardziej złożonych obliczeń.
Oto przykład monady Reader w 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))
}
// ...
}
Można na przykład utworzyć obiekt Reader, który pobiera obiekt konfiguracyjny i zwraca wartość opartą na tej konfiguracji. Następnie można połączyć wiele z tych czytników, aby utworzyć bardziej złożone obliczenia, bez konieczności przekazywania obiektu konfiguracyjnego przez każdy krok.
Należy zauważyć, że Reader Monada nie jest powszechnym wzorcem w JavaScript, jest używany głównie w funkcjonalnych językach programowania, takich jak Haskell, scala itp.
Oto przykład, jak możesz użyć ReaderMonady w 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);
}
}
Monada Readersłuży do wyabstrahowania przekazywania konfiguracji, zależności lub kontekstu w całym programie lub zestawie funkcji.
W tym przykładzie incrementCounter()metoda zwiększa licznik i zwraca nową wartość, decrementCounter()metoda zmniejsza licznik i zwraca nową wartość, getCounter()metoda zwraca bieżącą wartość licznika.
Możesz połączyć wiele obliczeń za pomocą metod .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());
Należy zauważyć, że ten przykład jest prosty i nie pokazuje pełnej mocy monad w programowaniu funkcjonalnym. Monad można używać do obsługi różnych przypadków, takich jak obsługa błędów, łączenie wielu obliczeń i nie tylko. Najlepiej zrozumieć problem i przypadki użycia przed zastosowaniem monad.
Ponadto run()metoda musi zostać wywołana, aby wykonać Reader Monad i uzyskać wyniki, przyjmuje środowisko jako argument.
Lista części:

![Czym w ogóle jest lista połączona? [Część 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































