Nest.JS | Monads -> IO
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 ใช้เพื่อแยกรหัสที่ไม่บริสุทธิ์ออกจากรหัสบริสุทธิ์เพื่อการจัดระเบียบรหัสที่ดีขึ้น และการทดสอบ
รายการชิ้นส่วน:





































![รายการที่เชื่อมโยงคืออะไร? [ส่วนที่ 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)