Nest.JS | Monad -> Daftar

Jan 27 2023
Daftar monad, juga dikenal sebagai monad Array, adalah monad yang digunakan untuk merepresentasikan perhitungan yang dapat memiliki beberapa kemungkinan hasil. Ini adalah monad yang membungkus array dan memungkinkan Anda untuk menggunakan metode monadik seperti map, chain, flatMap, dll.

Monad List, juga dikenal sebagai Arraymonad, adalah monad yang digunakan untuk merepresentasikan perhitungan yang dapat memiliki beberapa kemungkinan hasil. Ini adalah monad yang membungkus array dan memungkinkan Anda untuk menggunakan metode monadik seperti map, chain, flatMap, dll. pada array.

Monad Listbiasanya diimplementasikan sebagai objek yang memiliki metode tunggal flatMapyang menerapkan fungsi ke setiap elemen array dan menggabungkan hasilnya.

Berikut adalah contoh monad Listdalam JavaScript:

class List {
  constructor(values) {
    this.values = values;
  }
  flatMap(f) {
    return new List(this.values.reduce((acc, x) => acc.concat(f(x)), []));
  }
}

const list = new List([1, 2, 3]);
const result = list.flatMap(x => [x * 2, x * 3]);
console.log(result.values); // [2, 3, 4, 6, 6, 9]

Misalnya, Anda dapat membuat sebuah Listyang membungkus larik angka, lalu menggunakan flatMapmetode untuk menerapkan fungsi ke setiap elemen larik, dan menggabungkan hasilnya. Anda kemudian dapat menggabungkan beberapa perhitungan ini untuk membuat perhitungan yang lebih kompleks.

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

import { Injectable } from '@nestjs/common';
import { List } from 'fp-ts/lib/List';

@Injectable()
export class MyService {
  public async getUsers(): Promise<List<User>> {
    const users = await this.userRepository.find();
    return List.fromArray(users);
  }

  public async getUserById(id: string): Promise<List<User>> {
    const user = await this.userRepository.findOne(id);
    return List.of(user);
  }
}

Anda dapat merangkai banyak komputasi menggunakan metode .map(), .filter(), .reduce().

myService.getUsers()
  .map(users => users.filter(user => user.age > 18))
  .map(users => users.map(user => user.name))
  .map(users => users.reduce((acc, curr) => acc + ', ' + curr))
  .fold(error => console.log(error), result => console.log(result))

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: