Nest.JS | Monad -> Baik

Jan 27 2023
Monad Either, juga dikenal sebagai monad Hasil, adalah monad yang digunakan untuk merepresentasikan perhitungan yang dapat memiliki salah satu dari dua hasil yang mungkin: nilai bertipe Kiri atau nilai bertipe Kanan. Tipe Kiri biasanya digunakan untuk merepresentasikan kesalahan atau kegagalan, sedangkan tipe Kanan digunakan untuk merepresentasikan perhitungan yang berhasil.

Monad Either, juga dikenal sebagai Resultmonad, adalah monad yang digunakan untuk merepresentasikan komputasi yang dapat memiliki salah satu dari dua kemungkinan hasil: nilai bertipe Leftatau nilai bertipe Right. Tipe Leftbiasanya digunakan untuk merepresentasikan kesalahan atau kegagalan, sedangkan Righttipe digunakan untuk merepresentasikan komputasi yang sukses.

Monad Eitherbiasanya diimplementasikan sebagai objek yang memiliki dua subtipe: Leftdan Right. Subtipe Leftmemiliki nilai kesalahan, sedangkan Rightsubtipe memiliki nilai sukses.

Berikut adalah contoh monad Eitherdalam JavaScript:

class Left {
  constructor(value) {
    this.value = value;
  }
  map(f) {
    return this;
  }
  chain(f) {
    return this;
  }
  getOrElse(defaultValue) {
    return defaultValue;
  }
}

class Right {
  constructor(value) {
    this.value = value;
  }
  map(f) {
    return new Right(f(this.value));
  }
  chain(f) {
    return f(this.value);
  }
  getOrElse(defaultValue) {
    return this.value;
  }
}

Misalnya, Anda bisa membuat Rightyang menggabungkan angka lalu menggunakan mapmetode untuk menambah angka itu, atau Anda bisa membuat Leftyang menggabungkan pesan kesalahan, lalu menggunakan getOrElsemetode untuk menangani kesalahan. Anda kemudian dapat menggabungkan beberapa dari ini Rightdan Leftbersama-sama untuk membuat perhitungan yang lebih kompleks, tanpa harus memeriksa keberadaan nilai atau kesalahan secara manual di setiap langkah.

Di Nest.js, EitherMonad adalah Monad yang memungkinkan Anda menangani kesalahan dan mengembalikan nilai dengan cara yang fungsional. Ini dapat digunakan untuk mewakili hasil perhitungan yang dapat berupa keberhasilan (nilai kanan) atau kegagalan (nilai kiri).

Berikut adalah contoh bagaimana Anda dapat menggunakan EitherMonad di Nest.js:

import { Injectable } from '@nestjs/common';
import { Either, left, right } from 'fp-ts/lib/Either';

@Injectable()
export class MyService {
  public findUserById(id: number): Either<Error, User> {
    const user = findUserInDB(id);
    if (user) {
      return right(user);
    } else {
      return left(new Error('User not found'));
    }
  }
}

Anda dapat menggunakan .fold()metode ini untuk melampirkan fungsi callback yang akan dipanggil dengan nilai Monad Either.

myService.findUserById(1)
        .fold(error => console.log(error), user => console.log(user))

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.

Daftar bagian: