ネスト.JS | モナド -> リーダー

Jan 27 2023
「環境モナド」としても知られる Reader モナドは、計算中に環境または共有コンテキストを渡すことを可能にする関数型プログラミングの概念です。これにより、コンテキストの特定の値に依存しないコードを作成できるため、コードの再利用性が向上し、テストが容易になります。

「環境モナド」としても知られる Reader モナドは、計算中に環境または共有コンテキストを渡すことを可能にする関数型プログラミングの概念です。これにより、コンテキストの特定の値に依存しないコードを作成できるため、コードの再利用性が向上し、テストが容易になります。

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

Reader モナドは通常、 と呼ばれる単一のメソッドを持つオブジェクトとして実装されますrun。このメソッドはコンテキストを入力として受け取り、計算の結果を返します。Reader モナドを使用すると、同じコンテキストに依存する複数の計算を連鎖させ、より複雑な計算を作成できます。

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

class Reader {
  constructor(fn) {
    this.run = fn
  }
  map(f) {
    return new Reader(e => f(this.run(e)))
  }
  chain(f) {
    return new Reader(e => f(this.run(e)).run(e))
  }
  // ...
}

たとえば、構成オブジェクトを受け取り、その構成に基づいて値を返す Reader を作成できます。その後、これらのリーダーを複数連結して、各ステップで構成オブジェクトを渡すことなく、より複雑な計算を作成できます。

Reader モナドは JavaScript では一般的なパターンではなく、主に Haskell、scala などの関数型プログラミング言語で使用されることに注意することが重要です。

ReaderNest.js でモナドを使用する方法の例を次に示します。

import { Injectable } from '@nestjs/common';
import { Reader, reader } from 'fp-ts/lib/Reader';

@Injectable()
export class MyService {
  public incrementCounter(counter: number): Reader<number, number> {
    return reader.of(counter + 1);
  }

  public decrementCounter(counter: number): Reader<number, number> {
    return reader.of(counter - 1);
  }

  public getCounter(counter: number): Reader<number, number> {
    return reader.of(counter);
  }
}

モナドReaderは、プログラムまたは一連の関数全体にわたる構成、依存関係、またはコンテキストの受け渡しを抽象化するために使用されます。

この例では、incrementCounter()メソッドはカウンタをインクリメントして新しい値を返し、decrementCounter()メソッドはカウンタをデクリメントして新しい値を返し、getCounter()メソッドは現在のカウンタ値を返します。

.map()、.chain()、メソッドを使用して複数の計算を連鎖させることができます.ap()。

const program: Reader<number, number> = myService
  .incrementCounter(10)
  .chain(counter => myService.decrementCounter(counter))
  .chain(counter => myService.getCounter(counter));

console.log(program.run());

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

また、run()Reader モナドを実行して結果を取得するにはメソッドを呼び出す必要があり、環境を引数として受け取ります。

パーツのリスト: