私は最初の定義には興味がありません-それらは私が実際のプログラムを書くのを助けにはしません(あなたが私に間違っていると納得させれば+1)。2番目の定義を理解してください。map、filter、reduceは便利だと思います。これらを使用すると、より高いレベルでプログラムを作成できます。ミスが少なく、コードが短くて明確になります。
2つの定義は基本的に同じものです。1つ目は正式な定義に基づいており、提供する例はプリミティブコンビネーター(可能な最小のビルディングブロック)です。それらを使用すると、より高度なコンビネーターを構築できる限り、実際のプログラムを作成するのに役立ちます。SやKのようなコンビネータを、架空の「コンビナトリアルコンピュータ」の機械語と考えてください。もちろん、実際のコンピューターはそのようには機能しません。そのため、実際には通常、より高いレベルの操作が別の方法でバックグラウンドで実装されますが、概念的な基盤は、これらのより高いレベルの意味を理解するための有用なツールです。操作。
2番目の定義は、より非公式であり、他の関数をさまざまな方法で組み合わせる高次関数の形で、より洗練されたコンビネーターを使用することです。基本的なビルディングブロックが上記のプリミティブコンビネーターである場合、それらから構築されたものはすべて高次関数とコンビネーターでもあることに注意してください。ただし、他のプリミティブが存在する言語では、関数であるかどうかで区別されます。その場合、コンビネーターは通常、非関数ではなく、一般的な方法で他の関数を操作する関数として定義されます。物事を直接機能させます。
マップ、フィルターなどのコンビネーターの他の例は何ですか?
リストするには多すぎます!これらはどちらも、単一の値の動作を記述する関数を、コレクション全体の動作を記述する関数に変換します。また、エンドツーエンドで構成したり、引数を分割して再結合したりするなど、他の関数のみを変換する関数を持つこともできます。シングルステップ操作を、コレクションを生成または消費する再帰的操作に変換するコンビネーターを使用できます。それとも他のあらゆる種類のものです
プログラミング言語はどのコンビネーターによく実装されていますか?
それはかなり異なります。完全に汎用的なコンビネーターはほとんどなく(主に上記のプリミティブなもの)、そのため、ほとんどの場合、コンビネーターは、使用されているデータ構造を認識します(これらのデータ構造が他のコンビネーターから構築されている場合でも)。場合によっては、通常、「完全に汎用的な」コンビネータがいくつかあり、その後、誰かが提供しようと決めたさまざまな特殊な形式があります。(適切に一般化されたバージョンの)map、fold、unfoldで、必要なほぼすべてのことを実行できるケースがとんでもない数にあります。
コンビネーターは、より良いAPIを設計するのにどのように役立ちますか?
まさにあなたが言ったように、低レベルの詳細ではなく、高レベルの操作とそれらの相互作用の方法の観点から考えることによって。
コレクションの列挙の詳細を抽象化できる、コレクションに対する「for each」スタイルのループの人気について考えてください。これらはほとんどの場合、単なるマップ/折りたたみ操作であり、それを(組み込みの構文ではなく)コンビネーターにすることで、2つの既存のループを取得し、それらを複数の方法で直接結合するなど、一方を他方の中にネストし、一連のコード全体をジャグリングするのではなく、コンビネータを適用するだけで、次々と実行します。
効果的なコンビネーターを設計するにはどうすればよいですか?
まず、プログラムが使用するデータに対してどのような操作が意味があるかを考えます。次に、それらの操作を一般的な方法でどのように意味のある形で組み合わせることができるか、また、操作を相互に接続された小さな部分に分割する方法について考えます。主なことは、直接的なアクションではなく、変換と操作を処理することです。複雑な機能を不透明な方法で実行し、ある種の事前に消化された結果を出力するだけの関数がある場合、それを使用してできることはあまりありません。最終結果は、コンビネーターを使用するコードに任せます。プロセスの開始または終了を期待するものではなく、ポイントAからポイントBに移動する必要があります。
非関数型言語(Javaなど)と似ているコンビネーターとは何ですか、またはこれらの言語はコンビネーターの代わりに何を使用していますか?
あはははは。おもしろいことですが、オブジェクトはそもそも実際には高次のものです。オブジェクトにはいくつかのデータがありますが、それらには一連の操作が含まれており、優れたOOP設計を構成する多くのものが「オブジェクト通常、データ構造ではなく、コンビネータのように動作します。」
したがって、おそらくここでの最良の答えは、コンビネータのようなものではなく、多くのゲッターおよびセッターメソッドまたはパブリックフィールドを持つクラスと、ほとんどが不透明で事前定義されたアクションの実行で構成されるロジックを使用することです。