ネスト.JS | モナド -> IO

Jan 27 2023
「入出力モナド」としても知られる IO モナドは、入出力操作の記述をその実行から分離できるようにする関数型プログラミングの概念です。つまり、明示的に呼び出されるまで実際にアクションを実行せずに、何らかの I/O アクション (ファイルからの読み取りやデータベースとの対話など) を実行する計算を定義できます。

「入出力モナド」としても知られる IO モナドは、入出力操作の記述をその実行から分離できるようにする関数型プログラミングの概念です。つまり、明示的に呼び出されるまで実際にアクションを実行せずに、何らかの I/O アクション (ファイルからの読み取りやデータベースとの対話など) を実行する計算を定義できます。

IO モナドは、JavaScript などの関数型プログラミング言語での副作用を管理するためによく使用されます。IO モナドを使用すると、純粋で構成可能な方法で効果的な計算を記述することができるため、コードの推論とテストが容易になります。

IO モナドは通常、 と呼ばれる単一のメソッドを持つオブジェクトとして実装されますrun。このメソッドは、I/O アクションを実行して結果を返します。IO モナドを使用すると、複数の I/O 操作を連鎖させ、より複雑な計算を作成できます。

以下は JavaScript の IO モナドの例です。

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()

この例は基本的な例であり、関数型プログラミングにおけるモナドの能力をすべて実証するものではないことに注意することが重要です。モナドは、エラー処理、複数の計算の連鎖など、さまざまなケースを処理するために使用できます。モナドを適用する前に、問題とユースケースを理解することが最善です。

また、run()IO モナドを実行して結果を取得するにはメソッドを呼び出す必要があります。これはimpure外部の状態/コンテキストに依存するため知られています。IO モナドは、コードをより適切に構成するために純粋なコードから不純なコードを分離するために使用されます。そしてテスト。

パーツのリスト: