Nest.JS | Monad -> Negara
State monad adalah konsep pemrograman fungsional yang memungkinkan Anda mengelola status dengan cara yang fungsional dan tidak dapat diubah. Ini memungkinkan Anda untuk menulis kode yang memperbarui status komputasi dengan cara yang murni dan dapat disusun, yang membuatnya lebih mudah untuk dipikirkan dan diuji.
State monad sering digunakan untuk mengelola komputasi stateful dalam bahasa pemrograman fungsional, seperti JavaScript. State monad memungkinkan Anda untuk mendeskripsikan komputasi yang memperbarui beberapa status dengan cara yang murni dan dapat disusun, yang membuatnya lebih mudah untuk memikirkan dan menguji kode Anda.
Sebuah monad Negara biasanya diimplementasikan sebagai objek yang memiliki metode tunggal, disebut run, yang mengambil keadaan awal sebagai input dan mengembalikan hasil perhitungan dan keadaan yang diperbarui. State monad dapat digunakan untuk menyatukan beberapa perhitungan yang memperbarui keadaan yang sama dan membuat perhitungan yang lebih kompleks.
Berikut adalah contoh monad Negara di JavaScript:
class State {
constructor(fn) {
this.run = fn
}
map(f) {
return new State((state) => {
const [result, updatedState] = this.run(state);
return [f(result), updatedState];
});
}
chain(f) {
return new State((state) => {
const [result, updatedState] = this.run(state);
return f(result).run(updatedState);
});
}
// ...
}
Misalnya, Anda dapat membuat Negara Bagian yang mengambil nomor awal dan mengembalikan nomor baru yang bertambah satu, Anda kemudian dapat menggabungkan beberapa Negara bagian ini untuk membuat perhitungan yang lebih kompleks yang memperbarui negara bagian beberapa kali, tanpa harus melewatinya secara manual. menyatakan melalui setiap langkah.
Penting untuk dicatat bahwa State Monad bukanlah pola umum dalam JavaScript, ini terutama digunakan dalam bahasa pemrograman fungsional seperti Haskell, scala, dll.
Berikut adalah contoh bagaimana Anda dapat menggunakan StateMonad di Nest.js:
import { Injectable } from '@nestjs/common';
import { State, state } from 'fp-ts/lib/State';
interface StateType {
counter: number;
}
@Injectable()
export class MyService {
public incrementCounter(): State<StateType, number> {
return state.get().map(s => s.counter + 1).put({ counter: s.counter + 1 });
}
public decrementCounter(): State<StateType, number> {
return state.get().map(s => s.counter - 1).put({ counter: s.counter - 1 });
}
public getCounter(): State<StateType, number> {
return state.get().map(s => s.counter);
}
}
Monad Statedigunakan untuk mengelola keadaan dengan cara fungsional, contoh ini menggunakan pencacah sederhana sebagai keadaan, tetapi keadaan dapat berupa objek atau larik.
Metode incrementCounter()menambah penghitung dan memperbarui status, decrementCounter()metode mengurangi penghitung dan memperbarui status, getCounter()metode mengembalikan nilai penghitung saat ini.
Anda dapat merangkai banyak komputasi menggunakan metode .map(), .chain(), .ap().
const program: State<StateType, number> = myService
.incrementCounter()
.chain(() => myService.incrementCounter())
.chain(() => myService.getCounter());
console.log(program.run({ counter: 0 }).value);
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 State Monad dan mendapatkan hasilnya, dibutuhkan keadaan awal sebagai argumen.
Daftar bagian:

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



































