「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > JavaScript の関数型プログラミング入門: モナドとファンクター #7

JavaScript の関数型プログラミング入門: モナドとファンクター #7

2024 年 7 月 29 日に公開
ブラウズ:677

Introduction to Functional Programming in JavaScript: Monad and functors #7

モナドとファンクターは、データ変換、副作用、合成を処理するための強力な抽象化を提供する関数型プログラミングの高度な概念です。これらは数学の圏論に由来しますが、JavaScript などのプログラミング言語でも実用的です。

ファンクターとは何ですか?

ファンクターは、ファンクター内の値に関数を適用し、変換された値を持つ新しいファンクターを返すマップ メソッドを実装するデータ型です。基本的に、ファンクターを使用すると、コンテナーの構造を変更せずに、ラップされた値に関数を適用できます。

ファンクターの例
class Box {
  constructor(value) {
    this.value = value;
  }

  map(fn) {
    return new Box(fn(this.value));
  }
}

// Usage
const box = new Box(2);
const result = box.map(x => x   3).map(x => x * 2);
console.log(result); // Box { value: 10 }

この例では、Box はファンクターです。 Map メソッドは、ボックス内の値に関数 fn を適用し、変換された値を含む新しいボックスを返します。

モナドとは何ですか?

モナドは、2 つの追加メソッド、of (言語によっては return) と flatMap (バインドまたはチェーンとも呼ばれる) を実装するファンクターの一種です。モナドは、モナドのコンテキストを維持しながら、含まれる値に対する操作を連鎖する方法を提供します。

モナドの性質
  1. Unit (of): 値を受け取り、その値を含むモナドを返すメソッド。
  2. Bind ( flatMap): モナドを返す関数を受け取り、それを含まれる値に適用し、結果を平坦化するメソッド。
モナドの例
class Box {
  constructor(value) {
    this.value = value;
  }

  static of(value) {
    return new Box(value);
  }

  map(fn) {
    return Box.of(fn(this.value));
  }

  flatMap(fn) {
    return fn(this.value);
  }
}

// Usage
const box = Box.of(2);
const result = box
  .flatMap(x => Box.of(x   3))
  .flatMap(x => Box.of(x * 2));
console.log(result); // Box { value: 10 }

この例では、Box はファンクターでもありモナドでもあります。 of メソッドはボックス内の値をラップし、 flatMap メソッドは含まれる値に関数を適用して、結果のモナドを返します。

モナドとファンクターの実用的な使用例

モナドとファンクターは単なる理論的な構成要素ではありません。これらは現実世界のプログラミングに実際に応用できます。いくつかの一般的な使用例を見てみましょう。

オプションの値をMaybe Monadで処理する

Maybe モナドはオプションの値を処理するために使用され、null または未定義の値を回避し、操作を連鎖する安全な方法を提供します。

class Maybe {
  constructor(value) {
    this.value = value;
  }

  static of(value) {
    return new Maybe(value);
  }

  isNothing() {
    return this.value === null || this.value === undefined;
  }

  map(fn) {
    return this.isNothing() ? this : Maybe.of(fn(this.value));
  }

  flatMap(fn) {
    return this.isNothing() ? this : fn(this.value);
  }
}

// Usage
const maybeValue = Maybe.of('hello')
  .map(str => str.toUpperCase())
  .flatMap(str => Maybe.of(`${str} WORLD`));
console.log(maybeValue); // Maybe { value: 'HELLO WORLD' }

この例では、Maybe モナドはオプションの値を安全に処理し、値が null または未定義でない場合にのみ変換を許可します。

Promise Monad による非同期操作の処理

JavaScript の Promise は非同期操作を処理するモナドであり、操作を連鎖させてエラーを処理する方法を提供します。

const fetchData = url => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(`Data from ${url}`);
    }, 1000);
  });
};

// Usage
fetchData('https://api.example.com')
  .then(data => {
    console.log(data); // 'Data from https://api.example.com'
    return fetchData('https://api.example.com/2');
  })
  .then(data => {
    console.log(data); // 'Data from https://api.example.com/2'
  })
  .catch(error => {
    console.error(error);
  });

Promise を使用すると、非同期操作をクリーンで構成可能な方法で処理し、操作を連鎖させ、エラーを適切に処理できます。

モナドとファンクターは関数型プログラミングにおける強力な抽象化であり、より構造化された予測可能な方法でデータ変換、副作用、合成を扱うことができます。

モナドとファンクターの数学的基礎は複雑になる可能性がありますが、実際のアプリケーションは現実世界のプログラミングにおいて非常に価値があります。 might モナドでオプションの値を処理する場合でも、Promise で非同期操作を管理する場合でも、これらの関数型プログラミング手法は、より堅牢で信頼性の高いアプリケーションを作成するのに役立ちます。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/francescoagati/introduction-to-function-programming-in-javascript-monad-and-functors-7-1l6l?1 侵害がある場合は、study_golang@163 までご連絡ください。 .comを削除してください
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3