Nest.JS | Monads -> รายการ

Jan 27 2023
รายการ monad หรือที่เรียกว่า Array monad เป็น monad ที่ใช้เพื่อแสดงการคำนวณที่สามารถมีผลลัพธ์ที่เป็นไปได้หลายรายการ เป็น monad ที่ล้อมรอบอาร์เรย์และอนุญาตให้คุณใช้วิธีการ monadic เช่น map, chain, flatMap เป็นต้น

monad Listหรือที่เรียกว่าArraymonad เป็น monad ที่ใช้แทนการคำนวณที่สามารถมีผลลัพธ์ที่เป็นไปได้หลายอย่าง เป็น Monad ที่ล้อมรอบอาร์เรย์และอนุญาตให้คุณใช้วิธีการ Monadic เช่นmap, chain, flatMapฯลฯ บนอาร์เรย์

โดยทั่วไปแล้ว monad Listจะถูกนำไปใช้เป็นวัตถุที่มีวิธีการเดียวflatMapซึ่งใช้ฟังก์ชันกับแต่ละองค์ประกอบของอาร์เรย์และเชื่อมผลลัพธ์เข้าด้วยกัน

นี่คือตัวอย่างของListmonad ใน 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]

ตัวอย่างเช่น คุณสามารถสร้างอาร์เรย์Listที่ล้อมรอบอาร์เรย์ของตัวเลข จากนั้นใช้flatMapเมธอดเพื่อนำฟังก์ชันไปใช้กับแต่ละองค์ประกอบของอาร์เรย์ และต่อผลลัพธ์เข้าด้วยกัน จากนั้นคุณสามารถเชื่อมโยงการคำนวณหลายรายการเข้าด้วยกันเพื่อสร้างการคำนวณที่ซับซ้อนยิ่งขึ้น

ตัวอย่างวิธีใช้ListMonad ใน 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);
  }
}

คุณสามารถเชื่อมโยงการคำนวณหลายรายการโดยใช้เมธอด.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))

สิ่งสำคัญคือต้องสังเกตว่าตัวอย่างนี้เป็นเพียงตัวอย่างพื้นฐานและไม่ได้แสดงให้เห็นถึงพลังทั้งหมดของ Monads ในการเขียนโปรแกรมเชิงฟังก์ชัน Monads สามารถใช้เพื่อจัดการกรณีต่างๆ เช่น การจัดการข้อผิดพลาด การผูกมัดการคำนวณหลายรายการ และอื่นๆ คุณควรเข้าใจปัญหาและใช้กรณีต่างๆ ก่อนใช้ Monads

รายการชิ้นส่วน: