最近、多くのネストされた非同期ワークフローで動作するコードを書いているときに、匂いがするパターンが出現しているのを見つけました。簡単な例:
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が無視を要求し始めたので、すぐに私には悪臭がしました。これが明確になることを願っています。