Nest.JS | Monad -> Pembaca
Monad Pembaca, juga dikenal sebagai "monad Lingkungan", adalah konsep pemrograman fungsional yang memungkinkan Anda melewatkan lingkungan, atau konteks bersama, selama komputasi. Ini memungkinkan Anda untuk menulis kode yang tidak bergantung pada nilai spesifik dari konteks tersebut, membuatnya lebih dapat digunakan kembali dan lebih mudah untuk diuji.
Monad Pembaca sering digunakan untuk mengelola dependensi dan nilai konfigurasi dalam bahasa pemrograman fungsional, seperti JavaScript. Monad Pembaca memungkinkan Anda mendeskripsikan perhitungan yang bergantung pada beberapa konteks eksternal dengan cara yang murni dan dapat disusun, yang membuatnya lebih mudah untuk memikirkan dan menguji kode Anda.
Monad Pembaca biasanya diimplementasikan sebagai objek yang memiliki metode tunggal, disebut run, yang mengambil konteks sebagai masukan dan mengembalikan hasil komputasi. Monad Pembaca dapat digunakan untuk menyatukan beberapa perhitungan yang bergantung pada konteks yang sama dan membuat perhitungan yang lebih kompleks.
Berikut adalah contoh monad Pembaca di 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))
}
// ...
}
Misalnya, Anda dapat membuat Pembaca yang mengambil objek konfigurasi dan mengembalikan nilai berdasarkan konfigurasi tersebut. Anda kemudian dapat menggabungkan beberapa Pembaca ini untuk membuat perhitungan yang lebih kompleks, tanpa harus melewati objek konfigurasi melalui setiap langkah.
Penting untuk dicatat bahwa Reader Monad bukanlah pola umum dalam JavaScript, ini terutama digunakan dalam bahasa pemrograman fungsional seperti Haskell, scala, dll.
Berikut adalah contoh bagaimana Anda dapat menggunakan ReaderMonad di 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);
}
}
Monad Readerdigunakan untuk mengabstraksi penerusan konfigurasi, dependensi, atau konteks di seluruh program atau sekumpulan fungsi.
Dalam contoh ini, incrementCounter()metode menaikkan penghitung dan mengembalikan nilai baru, decrementCounter()metode menurunkan penghitung dan mengembalikan nilai baru, getCounter()metode mengembalikan nilai penghitung saat ini.
Anda dapat merangkai banyak komputasi menggunakan metode .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());
Penting untuk diperhatikan bahwa contoh ini adalah contoh dasar dan tidak mendemonstrasikan kekuatan penuh Monad dalam pemrograman fungsional. Monad dapat digunakan untuk menangani berbagai kasus seperti penanganan kesalahan, rangkaian perhitungan ganda dan banyak lagi, yang terbaik adalah memahami masalah dan menggunakan kasus sebelum menerapkan monad.
Juga, run()metode harus dipanggil untuk mengeksekusi Reader Monad dan mendapatkan hasilnya, dibutuhkan lingkungan sebagai argumen.
Daftar bagian:

![Apa itu Linked List? [Bagian 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































