モナドとファンクターは、データ変換、副作用、合成を処理するための強力な抽象化を提供する関数型プログラミングの高度な概念です。これらは数学の圏論に由来しますが、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 (バインドまたはチェーンとも呼ばれる) を実装するファンクターの一種です。モナドは、モナドのコンテキストを維持しながら、含まれる値に対する操作を連鎖する方法を提供します。
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 モナドはオプションの値を処理するために使用され、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 または未定義でない場合にのみ変換を許可します。
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 を使用すると、非同期操作をクリーンで構成可能な方法で処理し、操作を連鎖させてエラーを適切に処理できます。
モナドとファンクターは関数型プログラミングにおける強力な抽象化であり、より構造化された予測可能な方法でデータ変換、副作用、合成を扱うことができます。
モナドとファンクターの数学的基礎は複雑になる可能性がありますが、実際のアプリケーションは現実世界のプログラミングにおいて非常に価値があります。 Maybe モナドでオプションの値を処理する場合でも、Promise で非同期操作を管理する場合でも、これらの関数プログラミング手法は、より堅牢で信頼性の高いアプリケーションを作成するのに役立ちます。
以上がJavaScript の関数型プログラミング入門: モナドとファンクター #7の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。