1

最近、多くのネストされた非同期ワークフローで動作するコードを書いているときに、匂いがするパターンが出現しているのを見つけました。簡単な例:

let flip f x y = f y x
let slowInc x = async {
    do! Async.Sleep 500
    printfn "Here you go, %d" x
}

let verboseFun inp = async {
    match List.tryFind (flip (>) 3) inp with
    | Some x -> do! slowInc x
    | _ -> ()
}

verboseFun [1..5] |> Async.RunSynchronously

「verboseFun」は冗長に思えますが、Option モナドと Async モナドを組み合わせて、パターン マッチなしで書き直す方法が思い浮かびません。みたいなことを考えていた

let terseFun inp = async {
    inp
    |> List.tryFind (flip (>) 3)
    |> Option.iterAsync slowInc
}

これを実現するために利用できる構成要素を知らない可能性が非常に高いように思えました。

編集:トーマスの回答後の追加の説明。

すべてが同期している場合、私にとって些細なことを適応させようとしていました。

let terseFun inp =
    inp
    |> List.tryFind (flip (>) 3)
    |> Option.iter someSideEffectFunciton

ネストされた非同期ワークフローの一部になります。もともと「そこにドッコッ!」と思っていたので思いつきました。

let terseFun inp = async {
    inp
    |> List.tryFind (flip (>) 3)
    |> Option.iter (fun x -> async { do! someSideEffectFunciton x })
    |> ignore
}

しかし、VSが無視を要求し始めたので、すぐに私には悪臭がしました。これが明確になることを願っています。

4

1 に答える 1

2

ExtCore ライブラリには、オプションの値 (型など) を返す非同期計算を操作できる一連のヘルパー関数があり、それらを操作するための計算ビルダーAsync<'T option>も定義されています。asyncMaybe

私はそれを広範囲に使用したことはありませんが、私が行ったいくつかの簡単な実験から、F# の残りの機能とうまく統合されていないように見えasyncますが、この方向に進みたい場合は、ExtCore がおそらく周りの最高の図書館。

以下はfrom ( source is hereiter ) の関数を使用しています。typeにする必要があったため、少し醜いですが、あなたが求めていたものにかなり近いです:AsyncMaybe.ArrayslowIncAsync<unit option>

let slowInc x = async {
    do! Async.Sleep 500
    printfn "Here you go, %d" x
    return Some ()
}

let verboseFun inp = 
  inp 
  |> List.tryFind (fun x -> 3 > x) 
  |> Array.ofSeq
  |> AsyncMaybe.Array.iter slowInc 
  |> Async.Ignore

さておき、flipこれは一般的に F# で推奨されるスタイルではないため、関数も削除しました (コードがわかりにくくなる傾向があります)。

とは言っても、ExtCore ライブラリ全体は本当に必要ないと思います。投稿した 1 つの例から一般的なパターンを理解するのは困難ですが、すべてのコード スニペットが投稿したものと似ている場合は、独自のasyncIter関数を定義して、他の場所で使用することができます。

let asyncIter f inp = async {
  match inp with 
  | None -> ()
  | Some v -> do! f v }

let verboseFun inp = 
   inp 
   |> List.tryFind (fun x -> x > 3) 
   |> asyncIter slowInc

F# の優れた点は、これらの抽象化を自分で記述し、ニーズに正確に一致するように作成するのが非常に簡単であることです:-)

于 2014-08-08T16:04:18.153 に答える