2016-11-12 7 views
11

私はF#とSuaveを学び始めました。F#の適用という本を読んでいます。F#Suave Warbler関数

私が苦労していることの1つは、​​の機能です。執行を延期することとは何かを知っていますが、なぜ、いつ、なぜ必要なのかを理解していません。

明らかに​​の代わりにrequest機能を使用することもできます。

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

答えて

15

contextは、​​の特殊なバージョンであるという意味で関連しています。彼らはすべて同じことをする - 彼らは彼らの議論のいくつかの側面を検査し、その議論に適用する関数を返す。

Suaveの基本的なビルディングブロックWebPartは、具体的なオブジェクトではなく、HttpContext -> Async<HttpContext> optionであることに注意してください。これが効果的に意味するのは、これらの3つの機能がHttpContextを検査し、その構成に基づいてWebPartを使用できることです。​​が何をその中核に

は、非常に簡単です:

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

あなたはそれを機能fと引数aを与えます。関数faを見て、't -> 'uという新しい関数を返します。aに適用されます。

事がおよそ​​それは完全に汎用的だということです - あなたはどこでもあなたがいる限り種類を揃えるよう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タイプが「ハードコードさ」であるということでは、 - 使いやすくなっています。

+0

おかげscrwtp:例のシナリオでは

このappは、予想される結果を提供します。いい答えだ。 –

18

もう1つの回答は、​​の機能とその関係をcontextrequestの機能について既に説明しました。私はいつあなたがこれらを使用したいのかを示したいと思います。

Suaveサーバーを起動するときには、ルーティング、HTTPメソッド、および応答生成機能のWebPartsの要求処理パイプラインを提供する必要があります。これは、Webサーバーを起動する頃には、すべてWebPart関数がすでに実行されていることを意味します。 、あなたはこのappパイプラインを使用してWebサーバを起動した場合app値を作成したとき、あなたは常に生成された同じタイムスタンプが表示されます

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

は、現在のサーバー時刻を表示ミニマルなWebアプリケーションを想像してみてあなたがウェブリクエストをいつリクエストするかに関わらず。

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

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

ありがとうございます。あなたとあなたのscrwtpの答えは非常に便利です。再度、感謝します。私はあなたの答えをupvotedしました。 –