Nest.JS | Monad -> IO

Jan 27 2023
IO monad, juga dikenal sebagai "Monad Input/Output," adalah konsep pemrograman fungsional yang memungkinkan Anda memisahkan deskripsi operasi input/output dari pelaksanaannya. Dengan kata lain, ini memungkinkan Anda untuk menentukan perhitungan yang melakukan beberapa tindakan I/O (seperti membaca dari file atau berinteraksi dengan database) tanpa benar-benar melakukan tindakan tersebut hingga dipanggil secara eksplisit.

IO monad, juga dikenal sebagai "Monad Input/Output," adalah konsep pemrograman fungsional yang memungkinkan Anda memisahkan deskripsi operasi input/output dari pelaksanaannya. Dengan kata lain, ini memungkinkan Anda untuk menentukan perhitungan yang melakukan beberapa tindakan I/O (seperti membaca dari file atau berinteraksi dengan database) tanpa benar-benar melakukan tindakan tersebut hingga dipanggil secara eksplisit.

Monad IO sering digunakan untuk mengelola efek samping dalam bahasa pemrograman fungsional, seperti JavaScript. Monad IO memungkinkan Anda mendeskripsikan komputasi yang efektif dengan cara yang murni dan dapat disusun, yang membuatnya lebih mudah untuk memikirkan dan menguji kode Anda.

Monad IO biasanya diimplementasikan sebagai objek yang memiliki metode tunggal, disebut run, yang melakukan tindakan I/O dan mengembalikan hasilnya. Monad IO dapat digunakan untuk menyatukan beberapa operasi I/O dan membuat perhitungan yang lebih kompleks.

Berikut adalah contoh monad IO dalam JavaScript:

class IO {
  constructor(effect) {
    this.effect = effect
  }
  run() {
    return this.effect()
  }
  map(f) {
    return new IO(() => f(this.run()))
  }
  chain(f) {
    return new IO(() => f(this.run()).run())
  }
  // ...
}

import { Injectable } from '@nestjs/common';
import { IO, io } from 'fp-ts/lib/IO';

@Injectable()
export class MyService {
  public async getUsers(): IO<User[]> {
    return io.fromPromise(this.userRepository.find());
  }

  public async getUserById(id: string): IO<User> {
    return io.fromPromise(this.userRepository.findOne(id));
  }
}

Anda dapat merangkai banyak komputasi menggunakan metode .map(), .chain(), .ap().

const program: IO<string> = myService.getUsers()
    .map(users => users.filter(user => user.age > 18))
    .chain(users => myService.getUserById(users[0].id))
    .map(user => user.name)

  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 IO Monad dan mendapatkan hasilnya, ini dikenal karena impuretergantung pada keadaan/konteks eksternal, IO Monad digunakan untuk memisahkan kode tidak murni dari kode murni untuk organisasi kode yang lebih baik dan pengujian.

Daftar bagian: