Expressions11/04/2019この記事の内容のF#コンピュテーション式は、制御フローの構造とバインディングを使用して、シーケンス処理および結合できる計算を作成するための便利な構文を提供します。トランスフォーマー、およびアプリケーションを表現する方法と考えることができます。Haskellのような他の言語とは異なり、それらは1つの抽象化に関連付けられておらず、マクロやその他の形式のメタプログラミングに依存せず、便利で状況依存の構文を実現できません。syntax.の概要Overview計算には多くの形式が必要です。一般的な計算形式は、簡単に理解して変更できるシングルスレッド実行です。すべての形式の計算は、シングルスレッド実行と単純なものではありません。computations一般に、アプリケーションの特定の部分で実行する必要がある状況依存の計算があります。コンテキストに依存するコードを記述することは困難な場合があります。計算を簡単に行うことができるためです。多くの場合、これらの抽象化は自分で記述することF#が困難です。そのため、コンピュテーション式と呼ばれる汎用的な方法があります。expressions.コンピュテーション式は、文脈に依存した計算をエンコードするための統一された構文と抽象化モデルを提供します。computations.すべての計算式は、ビルダー型によってサポートされます。ビルダーの型は、コンピュテーション式で使用できる操作を定義します。「コンピュテーション式の新しい型の作成」を参照してください。これは、カスタム計算式の作成方法を示しています。overviewすべての計算式の形式は次のとおりです。コンピュテーション式の式の本体です。コンピュテーション式のコードは次のようになります。}前の例で示したように、コンピュテーション式内で使用できる特殊な追加の構文があります。コンピュテーション式では、次の式の形式を使用できます。}これらのキーワードおよびその他の標準F#のキーワードは、バッキングビルダーの型で定義されている場合にのみ、コンピュテーション式で使用できます。使用するための構文砂糖であり、その後に結果のパターンマッチが続きます。result.ビルダーの型は、コンピュテーション式のフラグメントの結合方法を制御する特殊なメソッドを定義するオブジェクトです。そのメソッドは、コンピュテーション式の動作を制御します。ビルダークラスを記述するもう1つの方法は、ループやバインドなど、さまざまF#な構造の操作をカスタマイズできるということです。キーワードは、別のコンピュテーション式への呼び出しの結果を名前にバインドします。}letでコンピュテーション式への呼び出しをバインドすると、コンピュテーション式の結果は得られません。代わりに、そのコンピュテーション式に対して、実現されていない呼び出しの値をバインドします。使用して、結果にバインドします。メンバーによって定義されます。返すコンピュテーション式を呼び出すためのものです。Async<unit>です。CExpType<unit>される可能性があります。メンバーによって定義されます。キーワードは、IEnumerable<T>として使用できるように、コンピュテーション式から値を返すためのものです。sqほとんどの場合、呼び出し元は省略できます。演算子を使用することです。sq多くの異なる値を生成する可能性がある複雑な式の場合、場合によってはキーワードを省略するだけで、次のことが可能です。キーワードを使用する場合と同様に、コンピュテーション式の各要素は反復処理されるときに返されます。メンバーによって定義されます。キーワードは、コンピュテーション式から値のコレクションをフラット化するためのものです。よって呼び出されるコンピュテーション式の項目は1つずつ返され、結果がフラット化されます。メンバーによって定義されます。値のコレクションです。明示的に指定する必要があります。計算式では、その動作は暗黙的ではありません。キーワードは、コンピュテーション式に対応する型の値をラップします。するために使用されます。メンバーによって定義されます。キーワードは、コンピュテーション式の値を認識し、その結果をコンピュテーション式に対応する型にラップします。メンバーによって定義されます。別のコンピュテーション式です。キーワードを使用すると、別のコンピュテーション式への呼び出しをインライン化し、結果にパターン一致を行うことができます。}match!でコンピュテーション式を呼び出すと、let!のような呼び出しの結果が認識されます。これは、通常、結果が省略可能であるコンピュテーション式を呼び出すときに使用されます。expressionsコアF#ライブラリでは、シーケンス式、非同期ワークフロー、クエリ式という3つの組み込みのコンピュテーション式が定義されています。Expressionビルダークラスを作成し、クラスに特定の特別なメソッドを定義することで、独自のコンピュテーション式の特性を定義できます。ビルダークラスでは、次の表に示すように、必要に応じてメソッドを定義できます。table.次の表では、ワークフロービルダークラスで使用できるメソッドについて説明します。対して呼び出されます。計算式を関数としてラップします。対して呼び出されます。対して呼び出されます。コンピュテーション式を実行します。コンピュテーション式でシーケンス処理を行うために呼び出されます。式に対して呼び出されます。式に対して呼び出されます。式に対して呼び出されます。バインドに対して呼び出されます。式に対して呼び出されます。式に対して呼び出されます。式に対して呼び出されます。分岐に対して呼び出されます。メンバーに引用符として渡されることを示します。計算のすべてのインスタンスを引用符に変換します。コンストラクトを使用して返します。通常、これは、結合する計算の種類を特徴とする個別に定義された型です。これらのメソッドのシグネチャを使用すると、1つのコンストラクトから返されるワークフローオブジェクトを次の構造体に渡すことができるように、それらを組み合わせて入れ子にすることができます。コンパイラは、コンピュテーション式を解析するときに、前の表のメソッドとコンピュテーション式のコードを使用して、一連の入れ子になった関数呼び出しに式を変換します。expression.入れ子になった式の形式は次のとおりです。呼び出しは省略されます。|}として示されているコンピュテーション式の本体は、次の表に示す翻訳によって、ビルダークラスのメソッドを含む呼び出しに変換されます。コンピュテーション式である場合に、再帰的に定義されます。テーブルに記載されていない式について説明しています。ビルダークラスは、すべてのメソッドを実装する必要はなく、前の表に一覧表示されているすべての変換をサポートします。実装されていない構造体は、その型のコンピュテーション式では使用できません。class.次のコード例は、一度に1ステップずつ評価できる一連のステップとして計算をカプセル化するコンピュテーション式を示しています。OkOrExceptionは、これまでに評価された式のエラー状態をエンコードします。このコードは、いくつかのビルダーメソッドの定型的な実装など、計算式で使用できる一般的なパターンを示しています。stepコンピュテーション式には基になる型があり、この式はを返します。基になる型は、計算された結果または実行可能な遅延計算を表すことができます。一部の型のコレクションを反復処理する方法を提供する場合もあります。前の例では、基になる型は最終的にでした。System.Collections.Generic.IEnumerable<T>です。System.Linq.IQueryableです。非同期ワークフローの場合、基になる型はAsyncです。オブジェクトは、結果を計算するために実行する作業を表します。Async.RunSynchronouslyを呼び出して計算を実行し、その結果を返します。Operationsコンピュテーション式でカスタム操作を定義し、コンピュテーション式で演算子としてカスタム操作を使用することができます。クエリ式にクエリ演算子を含めることができます。メソッドを定義する必要があります。CustomOperationAttributeを適用します。この属性は、引数として文字列を受け取ります。これはカスタム操作で使用される名前です。この名前は、コンピュテーション式の左中かっこの先頭にあるスコープに含まれます。したがって、このブロック内のカスタム操作と同じ名前を持つ識別子は使用しないでください。識別子を使用しないようにします。Operations既にビルダークラスがある場合は、そのカスタム操作をこのビルダークラスの外部から拡張できます。拡張機能はモジュール内で宣言する必要があります。名前空間には、同じファイルと、型が定義されている同じ名前空間宣言グループ以外の拡張メンバーを含めることはできません。クラスの拡張を示しています。Expressions関連記事このページはお役に立ちましたか?YesNo追加のフィードバックはありますか?スキップ送信ありがとうございます。直接フィードバックを残すこともできます。直接フィードバックを残すこともできます。Cookie利用条件サイトのフィードバック商標このページはお役に立ちましたか?YesNo追加のフィードバックはありますか?スキップ送信ありがとうございます。Cookie利用条件サイトのフィードバック。