F# の学習を開始し、 F# AppliedSuave
という本を読んでいます。
私が苦労していることの1つはwarbler
機能です。実行の延期と関係があることは知っていますが、なぜ、いつ必要なのかはよくわかりません。
request
どうやら、関数を の代わりに使用することもできますwarbler
。
これらの機能が使用される理由と時期について、誰でも詳細を提供できますか。
他の回答では、関数とその関数とwarbler
の関係についてすでに説明されています。これらをいつ使用するかを示したいと思います。context
request
WebParts
Suave サーバーを起動するときは、ルーティング、HTTP メソッド、および応答生成関数の要求処理パイプラインをサーバーに提供する必要があります。これは、Web サーバーを起動するまでに、部分的に適用されたWebPart
関数に提供されたすべてのパラメーターが既に評価されていることを意味します。
現在のサーバー時間を出力する最小限の Web アプリを想像してください。
let app = GET >=> path "/" >=> OK (string DateTime.Now)
このパイプラインを使用して Web サーバーを起動すると、値を取得する Web リクエストをいつ行ってもapp
、値が作成されたときに生成された同じタイムスタンプが常に表示されます。app
関数とそのwarbler
特殊化されたバージョンは、実行を延期するだけcontext
でrequest
なく、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)
これら 3 つの関数は、request
とcontext
の特殊化されたバージョンであるという意味で関連しています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は、 をf
見a
て新しい関数を返し、't -> 'u
それが に適用されa
ます。
重要なのは、それが完全に汎用的であるということです。タイプが一致する限り、使用する場所ならどこでも使用できますが、Suave が関心を持っているドメインについては何も知りませんwarbler
。context
request
そのため、「ドメイン言語を話す」特殊なバージョンがあります。
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
タイプが「ハードコード」されていることです - 使いやすくなっています.