コメントするには長すぎます。そして、私は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