Nest.JS | Đơn nguyên -> IO
IO monad, còn được gọi là “Input/Output monad,” là một khái niệm lập trình chức năng cho phép bạn tách phần mô tả của thao tác đầu vào/đầu ra khỏi phần thực thi của nó. Nói cách khác, nó cho phép bạn xác định một phép tính thực hiện một số hành động I/O (chẳng hạn như đọc từ một tệp hoặc tương tác với cơ sở dữ liệu) mà không thực sự thực hiện hành động đó cho đến khi nó được gọi một cách rõ ràng.
IO monad thường được sử dụng để quản lý các tác dụng phụ trong ngôn ngữ lập trình chức năng, chẳng hạn như JavaScript. Đơn nguyên IO cho phép bạn mô tả một tính toán hiệu quả theo cách thuần túy, có thể tổng hợp được, giúp dễ dàng lập luận và kiểm tra mã của bạn hơn.
Một đơn nguyên IO thường được triển khai dưới dạng một đối tượng có một phương thức duy nhất, được gọi là run, phương thức này thực hiện hành động I/O và trả về kết quả. Đơn nguyên IO có thể được sử dụng để xâu chuỗi nhiều thao tác I/O lại với nhau và tạo ra các tính toán phức tạp hơn.
Đây là một ví dụ về đơn nguyên IO trong 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));
}
}
Bạn có thể xâu chuỗi nhiều phép tính bằng các phương thức .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()
Điều quan trọng cần lưu ý là ví dụ này là một ví dụ cơ bản và không thể hiện toàn bộ sức mạnh của Monads trong lập trình chức năng. Các đơn nguyên có thể được sử dụng để xử lý các trường hợp khác nhau như xử lý lỗi, xâu chuỗi nhiều phép tính, v.v., tốt nhất bạn nên hiểu vấn đề và các trường hợp sử dụng trước khi áp dụng các đơn nguyên.
Ngoài ra, run()phương thức phải được gọi để thực thi IO Monad và nhận kết quả, điều này được gọi là impurenó phụ thuộc vào trạng thái/bối cảnh bên ngoài, IO Monad được sử dụng để tách mã không thuần túy khỏi mã thuần túy để tổ chức mã tốt hơn và thử nghiệm.
Danh sách các bộ phận:

![Dù sao thì một danh sách được liên kết là gì? [Phần 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































