Girdi alan bir girdim var ve ya başarılı olan ve bazı girdiler döndürür veya Hiçbiri döndürür. Biri numaralardan birini cevaplayana kadar aranan telefon numaralarının bir listesini vereceğim ve daha sonra sayıların geri kalanı atlanmalıdır. Ve sonunda başarılı bir sayı veya bir hata mesajının kaydı var. , TryPick Daha iyi bir Liste fonksiyonu ile o kadar sıkılırF # idiomatic Deneyi Başla
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
: Bence
Benim ilk çözüm çok karmaşık ve aynı zamanda inelegant görünüyor ilk denemede, üzerinde arıza durumunun tohumlama kullanır
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
Bu iyi bir yaklaşım gibi görünüyor mu? Monadik hataların ele alınışını okuduktan sonra, bu ruhda bir şekilde bir şeyler yapmam gerekip gerekmediğini merak ediyorum.
'List.tryPick 'kullanarak çözümünüz tam olarak yazdığım kod gibi görünüyor ... –
Teşekkürler Tomas. Cevabınızı takdir edin. – RomnieEE
'List.tryPick' öğesine iletilen lambda, yalnızca' tryCallNumber' ile değiştirilebilir – TheQuickBrownFox