2016-08-14 11 views
5

は、私はちょうどTamizhvendan S」ブックF#アプライド・て作業を開始し、このコードスニペットに出くわした:これはどのような種類ですか?

type WebPart = Context -> Async<Context option> 

私はマイクロソフトのF#のドキュメントだけでなく、私のお気に入りのF#サイト、スコットWlaschinのF# for Fun and Profitを通して見てきたが、この種のタイプの参照を見つけることができませんでした。レコード型のようには見えません。ほとんど普通の古い機能のようです。それは何ですか?

ご協力ありがとうございました。

+3

これは、関数の型の省略形です。 –

+0

この場合、この 'WebPart'は' Context'をとり、単純に 'Option'と' Async'計算の両方をラップしますか? –

+0

これは関数定義ではありません。型の注釈を書くのに便利です。 –

答えて

12

WebPartタイプはSuaveです。 https://suave.io/async.htmlで詳細を読むことができますが、要約します。あなたは正しいです:それは関数のタイプです。具体的には、Context(SuaveではHTTP要求レコードと応答レコードの組み合わせ)を受け取り、Context optionを非同期に返します。つまり、一部の要求が失敗する可能性があるため、関数には値の代わりにNoneを返すというオプションがあります。要求の中には時間がかかるものがあるため、すべての要求は非同期に返されるため、Asyncとなります。

Suaveは2つのリクエストを連鎖させるために、バインド演算子>=>を提供していますので、常にasync { match result1 with None -> None | Some x -> return! request2 xと入力するという定型句を通過する必要はありません。代わりに、同じエフェクトの場合はrequest1 >=> request2と入力するだけです。

Suaveのマニュアルでさらに役立つ情報が必要な場合は、必要なヘルプを提供していない場合は、お知らせください。

+1

助けてくれてありがとう!これまでSuaveのこれまで見たことはScott WlaschinのRailyway Oriented Programming *の記事シリーズにかなり近いものでした。 –

+1

良い洞察力! 「成功」パスと「失敗」パスがあるため、ROPと同じコンセプトですが、余分なAsyncがスローされます。しかし、これは関数型プログラミングの素晴らしい点です。基本的な概念は多くの状況を引き継ぎます。ROP形式の「バインド」概念は、ROP形式の「成功」/「失敗」タイプと同様に、Async にも適用されます。 1つのコンセプトを学び、どこにでも適用できます。 – rmunn

3

これはコメントではありません。そして、私はSuaveを使ったことが一度もありません。しかし、私は、関係する型のモナドの性質から、>=>はバインド演算子ではなく、Kleisli構成演算子であると推測できます。 monad lawsを観察するか、単にする署名を想定し、category theoryを理解しようとせず:

val (>>=) : 
    Async<'a option> -> ('a -> Async<'b option>) -> Async<'b option> 
val (>=>) : 
    ('a -> Async<'b option>) -> ('b -> Async<'c option>) -> 'a -> Async<'c option> 

バインド演算子はAsync<'a option>を取り、Async<'b option>にバインダー機能'a -> Async<'b option>の方法によって、それを変換します。 Kleisli演算子は2つのバインダー関数を3つにまとめます。

これらの演算子は、type WebPart = Context -> Async<Context option>のような型の略語で記述された具体的な型よりも汎用的なモナド型と関数を処理しています。演算子の実装はほぼ自然に続きます。

let (>>=) request1 binder = async { 
    let! result1 = request1 
    match result1 with 
    | None -> return None 
    | Some x -> return! binder x } 

let (>=>) f g a = f a >>= g 
関連する問題