Nest.JS | Monads -> IO

Jan 27 2023
IO monad หรือที่เรียกว่า "Input/Output monad" เป็นแนวคิดการเขียนโปรแกรมเชิงฟังก์ชันที่ให้คุณแยกคำอธิบายของการดำเนินการอินพุต/เอาต์พุตออกจากการดำเนินการ กล่าวอีกนัยหนึ่ง จะช่วยให้คุณกำหนดการคำนวณที่ดำเนินการ I/O บางอย่าง (เช่น การอ่านจากไฟล์หรือการโต้ตอบกับฐานข้อมูล) โดยไม่ต้องดำเนินการนั้นจริง ๆ จนกว่าจะมีการเรียกใช้อย่างชัดเจน

IO monad หรือที่เรียกว่า "Input/Output monad" เป็นแนวคิดการเขียนโปรแกรมเชิงฟังก์ชันที่ให้คุณแยกคำอธิบายของการดำเนินการอินพุต/เอาต์พุตออกจากการดำเนินการ กล่าวอีกนัยหนึ่ง จะช่วยให้คุณกำหนดการคำนวณที่ดำเนินการ I/O บางอย่าง (เช่น การอ่านจากไฟล์หรือการโต้ตอบกับฐานข้อมูล) โดยไม่ต้องดำเนินการนั้นจริง ๆ จนกว่าจะมีการเรียกใช้อย่างชัดเจน

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

โดยทั่วไปแล้ว IO monad จะถูกนำไปใช้เป็นวัตถุที่มีเมธอดเดียว ซึ่งเรียกว่าrunซึ่งดำเนินการ I/O และส่งคืนผลลัพธ์ สามารถใช้ IO monad เพื่อเชื่อมโยงการดำเนินการ I/O หลายรายการเข้าด้วยกัน และสร้างการคำนวณที่ซับซ้อนมากขึ้น

นี่คือตัวอย่างของ IO monad ใน 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));
  }
}

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

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

นอกจากนี้run()ต้องเรียกใช้เมธอดเพื่อดำเนินการ IO Monad และรับผลลัพธ์ ซึ่งเรียกว่าimpureขึ้นอยู่กับสถานะ/บริบทภายนอก IO Monads ใช้เพื่อแยกรหัสที่ไม่บริสุทธิ์ออกจากรหัสบริสุทธิ์เพื่อการจัดระเบียบรหัสที่ดีขึ้น และการทดสอบ

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