तक प्रयास करें मेरे पास एक ऐसा फ़ंक्शन है जो इनपुट लेता है और या तो सफल होता है और देता है कुछ इनपुट या रिटर्न कोई नहीं। मैं उदाहरण को फ़ोन नंबरों की एक सूची बनाउंगा जो डायल किए जाएंगे जब तक कोई संख्याओं में से किसी एक का उत्तर न दे, और फिर शेष संख्याओं को छोड़ दिया जाना चाहिए। और अंत में एक सफल संख्या या एक त्रुटि संदेश का लॉगिंग है।एफ # idiomatic
मेरा पहला समाधान मुझे लगता है कि बहुत ही जटिल है और यह भी पहली कोशिश है, जो असजीला लगता है पर विफलता राज्य के एक बोने का उपयोग करता है:
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' का उपयोग कर आपका समाधान ठीक उसी कोड जैसा दिखता है जो मैं लिखूंगा ... –
धन्यवाद टॉमस। अपने उत्तर की सराहना करें। – RomnieEE
लैम्बडा को 'List.tryPick' पर पास किया गया है, केवल 'tryCallNumber' – TheQuickBrownFox