JavaScript の関数型プログラミングの概要: アプリケーション #10

WBOY
リリース: 2024-07-18 13:47:12
オリジナル
826 人が閲覧しました

Introduction to Functional Programming in JavaScript: Applicatives #10

アプリカティブは、オプションの値、非同期計算、リストなどのコンテキストを伴う関数やデータ構造を操作する強力かつ表現力豊かな方法を提供します。アプリカティブはファンクターの概念を拡張し、コンテキストでラップされた関数を、同様にコンテキストでラップされた値に適用できるようにします。

アプリカティブとは何ですか?

アプリカティブはファンクターの一種で、ラップされた値に対する関数のマッピング (ファンクターと同様) をサポートするだけでなく、コンテキスト内でラップされている関数自体をコンテキスト内でラップされている値に適用することもできます。アプリカティブは、複数の関数値を含む演算を処理する方法を提供します。

アプリカティブのプロパティ
  1. Identity: ラップされた値にラップされた ID 関数を適用すると、ラップされた値が生成されます。 [ text{A.of(x).ap(A.of(f))} equiv text{A.of(f(x))} ]
  2. 準同型性: ラップされた関数をラップされた値に適用すると、関数を値に適用してラップした場合と同じ結果が生成されます。 [ text{A.of(f).ap(A.of(x))} equiv text{A.of(f(x))} ]
  3. Interchange: ラップされた関数をラップされた値に適用することは、ラップされた関数を適用する関数にラップされた値を適用することと同等である必要があります。 [ text{A.of(f).ap(u)} equiv text{u.ap(A.of(f => f(x)))} ]

JavaScript でのアプリカティブの実装

JavaScript でアプリカティブを実装して使用する方法を見てみましょう。

例: アプリケーションとしてのMaybeの実装

Maybe 型は、オプションの値を表すためによく使用されます。応用操作をサポートするために、Maybe を拡張しましょう。

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

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

  map(fn) {
    return this.value === null || this.value === undefined
      ? Maybe.of(null)
      : Maybe.of(fn(this.value));
  }

  ap(maybe) {
    return this.value === null || this.value === undefined
      ? Maybe.of(null)
      : maybe.map(this.value);
  }
}

// Usage
const add = (a) => (b) => a + b;

const maybeAdd = Maybe.of(add);
const maybeTwo = Maybe.of(2);
const maybeThree = Maybe.of(3);

const result = maybeAdd.ap(maybeTwo).ap(maybeThree);
console.log(result); // Maybe { value: 5 }
ログイン後にコピー

この例では、Maybe は ap メソッドを実装します。このメソッドは、Maybe コンテキストでラップされた関数を、別のMaybe コンテキストでラップされた値に適用します。これにより、オプションの値を含む操作を連鎖させることができます。

実際にアプリカティブを使用する

アプリカティブは、複数の非同期操作を組み合わせたり、複数のオプションの値を処理したりするなど、複数のコンテキストが関係する計算を扱う場合に特に役立ちます。

例: 複数の Promise の結合

アプリカティブが複数の Promise を組み合わせるのにどのように役立つかを見てみましょう。

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

const add = (a) => (b) => a + b;

const promiseAdd = Promise.resolve(add);
const promiseTwo = fetchData('url1').then((data) => parseInt(data.split(' ')[2]));
const promiseThree = fetchData('url2').then((data) => parseInt(data.split(' ')[2]));

const result = promiseAdd
  .then((fn) => promiseTwo.then((a) => fn(a)))
  .then((fn) => promiseThree.then((b) => fn(b)));

result.then(console.log); // Output after 2 seconds: NaN (since "from" cannot be parsed as an int)
ログイン後にコピー

この例では、適用パターンを使用して複数の Promise を結合します。この例には解析に関する論理的な問題がありますが、アプリカティブを使用してコンテキストに関係する操作をシーケンスする方法を示しています。

例: 複数のオプション値の処理

アプリカティブは、複数のオプションの値を組み合わせる場合にも役立ちます。

const add = (a) => (b) => a + b;

const maybeAdd = Maybe.of(add);
const maybeFive = Maybe.of(5);
const maybeNull = Maybe.of(null);

const result1 = maybeAdd.ap(maybeFive).ap(maybeFive); // Maybe { value: 10 }
const result2 = maybeAdd.ap(maybeFive).ap(maybeNull); // Maybe { value: null }

console.log(result1); // Maybe { value: 10 }
console.log(result2); // Maybe { value: null }
ログイン後にコピー

この例では、適用パターンを使用して複数のMaybe値を結合し、nullの存在を適切に処理します。

以上がJavaScript の関数型プログラミングの概要: アプリケーション #10の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!