Гнездо.JS | Монады -> Читатель
Монада Reader, также известная как «монада Environment», представляет собой концепцию функционального программирования, которая позволяет вам передавать среду или общий контекст во время вычислений. Это позволяет вам писать код, который не зависит от конкретных значений этого контекста, что делает его более пригодным для повторного использования и более простым для тестирования.
Монада Reader часто используется для управления зависимостями и значениями конфигурации в функциональном языке программирования, таком как JavaScript. Монада Reader позволяет вам описать вычисление, которое зависит от некоторого внешнего контекста, чистым компонуемым способом, что упрощает анализ и тестирование вашего кода.
Монада Reader обычно реализуется как объект, имеющий единственный метод с именем run, который принимает контекст в качестве входных данных и возвращает результат вычисления. Монада Reader может использоваться для объединения нескольких вычислений, зависящих от одного и того же контекста, и создания более сложных вычислений.
Вот пример монады Reader в 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))
}
// ...
}
Например, вы можете создать Reader, который принимает объект конфигурации и возвращает значение на основе этой конфигурации. Затем вы можете связать несколько этих модулей чтения вместе, чтобы создать более сложные вычисления, без необходимости передавать объект конфигурации через каждый шаг.
Важно отметить, что читательская монада не является распространенным шаблоном в JavaScript, она в основном используется в функциональных языках программирования, таких как Haskell, scala и т. д.
Вот пример того, как вы можете использовать Readerмонаду в 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);
}
}
Монада Readerиспользуется для абстрагирования передачи конфигурации, зависимостей или контекста через программу или набор функций.
В этом примере incrementCounter()метод увеличивает счетчик и возвращает новое значение, decrementCounter()метод уменьшает счетчик и возвращает новое значение, getCounter()метод возвращает текущее значение счетчика.
Вы можете связать несколько вычислений, используя методы .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());
Важно отметить, что этот пример является базовым и не демонстрирует всю мощь монад в функциональном программировании. Монады можно использовать для обработки различных случаев, таких как обработка ошибок, объединение нескольких вычислений в цепочку и многое другое. Прежде чем применять монады, лучше понять проблему и варианты использования.
Также run()метод должен вызываться для того, чтобы выполнить читающую монаду и получить результаты, в качестве аргумента он принимает окружение.
Список частей:

![В любом случае, что такое связанный список? [Часть 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































