19

F# の学習を開始し、 F# AppliedSuaveという本を読んでいます。

私が苦労していることの1つはwarbler機能です。実行の延期と関係があることは知っていますが、なぜ、いつ必要なのかはよくわかりません。

requestどうやら、関数を の代わりに使用することもできますwarbler

これらの機能が使用される理由と時期について、誰でも詳細を提供できますか。

4

3 に答える 3

32

他の回答では、関数とその関数とwarblerの関係についてすでに説明されています。これらをいつ使用するかを示したいと思います。contextrequest

WebPartsSuave サーバーを起動するときは、ルーティング、HTTP メソッド、および応答生成関数の要求処理パイプラインをサーバーに提供する必要があります。これは、Web サーバーを起動するまでに、部分的に適用されたWebPart関数に提供されたすべてのパラメーターが既に評価されていることを意味します。

現在のサーバー時間を出力する最小限の Web アプリを想像してください。

let app = GET >=> path "/" >=> OK (string DateTime.Now)

このパイプラインを使用して Web サーバーを起動すると、値を取得する Web リクエストをいつ行ってもapp、値が作成されたときに生成された同じタイムスタンプが常に表示されます。app

関数とそのwarbler特殊化されたバージョンは、実行を延期するだけcontextrequestなく、Web サーバーがその結果を必要とするたびに、提供された関数を呼び出すことを可能にします。

シナリオ例では、これappにより期待される結果が得られます。

let app = GET >=> path "/" >=> warbler (fun ctx -> OK (string DateTime.Now))

@adzdavies のコメントは、必ずしも必要ではない別のアプローチを示していますwarbler。この例では、 を部分的に適用する代わりに無名関数構文を使用すると、パラメーターの評価を延期することもできますOK

let app = GET >=> path "/" >=> (fun ctx -> OK (string DateTime.Now) ctx)
于 2016-11-12T11:13:16.017 に答える
20

これら 3 つの関数は、requestcontextの特殊化されたバージョンであるという意味で関連していますwarbler。それらはすべて同じことを行います-引数(の一部の側面)を検査し、その引数に適用する関数を返します。

Suave の基本的な「構成要素」は、具体的なオブジェクトではなくWebPart関数であることを思い出してください。HttpContext -> Async<HttpContext option>これが実質的に意味することは、これらの 3 つの関数を使用すると、これを検査し、HttpContextそれに基づいて構成WebPartを使用できるようになるということです。

その核となるのwarblerは、非常に単純です。

let warbler f a = f a a  
// ('t -> 't -> 'u) -> 't -> 'u

関数fと引数を指定しますa。Functionは、 をfaて新しい関数を返し、't -> 'uそれが に適用されaます。

重要なのは、それが完全に汎用的であるということです。タイプが一致する限り、使用する場所ならどこでも使用できますが、Suave が関心を持っているドメインについては何も知りませんwarblercontextrequest

そのため、「ドメイン言語を話す」特殊なバージョンがあります。

let request apply (a : HttpContext) = apply a.request a
// (HttpRequest -> HttpContext -> 'a) -> HttpContext -> 'a 
let context apply (a : HttpContext) = apply a a
// (HttpContext -> HttpContext -> 'a) -> HttpContext -> 'a 

それらはウグイスと同じ「形状」を持っていることに注意してください - 唯一の違いはHttpContextタイプが「ハードコード」されていることです - 使いやすくなっています.

于 2016-11-12T10:46:40.217 に答える