私は、入力を受け取り、成功し、返す関数をいくつか持っています。この例では、誰かが数字のいずれかに答えるまでダイヤルされる電話番号のリストを作成し、残りの数字はスキップする必要があります。最後に、成功した番号またはエラーメッセージのログが記録されます。私が思うF#idiomatic Try Until
私の最初のソリューションは、洗練思われる、あまりにも複雑であり、また、最初の試行で障害状態の播種を使用しています。
type PhoneNumber = int
let tryCallNumber phoneNumber =
if phoneNumber % 2 = 0 then Some phoneNumber
else None
let nextCall phoneNumberOption nextNumber =
match phoneNumberOption with
| Some num -> phoneNumberOption
| None -> tryCallNumber nextNumber
let logCall phoneNumberOption =
match phoneNumberOption with
| Some num -> printfn "%i" num
| None -> printfn "%s" "failed"
let phoneNumbers = [111; 222; 444; 555]
do List.fold (fun state num -> (nextCall state num)) None phoneNumbers
|> logCall
私はより良いリスト機能、tryPickでそれを締め:
type PhoneNumber = int
let tryCallNumber phoneNumber =
if phoneNumber % 2 = 0 then Some phoneNumber
else None
let logCall phoneNumberOption =
match phoneNumberOption with
| Some num -> printfn "%i" num
| None -> printfn "%s" "failed"
let phoneNumbers = [111; 222; 444; 555]
do List.tryPick (fun num -> tryCallNumber num) phoneNumbers
|> logCall
これは良いアプローチのようですか?モナドのエラー処理について読んだ後、私は何とかその精神の中で何かをやっていなければならないのだろうかと思います。
'List.tryPick'を使ったあなたのソリューションは、私が書いたコードとまったく同じように見えます... –
Thanks Tomas。あなたの返事を感謝します。 – RomnieEE
'List.tryPick'に渡されたラムダは、' tryCallNumber'だけで置き換えることができます。 – TheQuickBrownFox