5

Tamizhvendan S の本F# Appliedを読み始めたところ、次のコード スニペットに出会いました。

type WebPart = Context -> Async<Context option>

私は、Microsoft の F# ドキュメントと、私のお気に入りの F# サイトである Scott Wlaschin のサイトF# for Fun and Profitを調べましたが、この種の型への参照を見つけることができませんでした。レコード型とは思えません。それはほとんど普通の古い機能のようです。それで、それは何ですか?

助けてくれてありがとう。

4

2 に答える 2

12

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

2 つのリクエストを連鎖させるために、Suave はバインディング オペレーターを提供する>=>ので、常に入力のボイラープレートを実行する必要はありませんasync { match result1 with None -> None | Some x -> return! request2 x。代わりに、入力するだけrequest1 >=> request2で同じ効果が得られます。

さらにヘルプが必要で、Suave のドキュメントを読んでも必要なヘルプが得られない場合は、お知らせください。詳しく説明します。

于 2016-08-14T02:05:07.877 に答える
3

コメントするには長すぎます。そして、私はSuaveを使用したことがありません。しかし、関連する型のモナド プロパティから推測できると思いますが、それ>=>はバインド演算子ではなく、Kleisli 合成演算子です。モナドの法則を観察したり、圏を理解しようとしたりせずに、署名が次のようになると推測するだけです。

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

bind 演算子は を受け取り、Async<'a option>バインダー関数を介して に変換し'a -> Async<'b option>ます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
于 2016-08-15T20:56:20.123 に答える