पहले अपने प्रश्न का उत्तर करने के लिए, संकलक शिकायत for
पाश अंदर एक समस्या है क्योंकि वहाँ। एफ # में, let
मूल्यों की घोषणा करने में कार्य करता है (जो अपरिवर्तनीय हैं और बाद में कार्यक्रम में नहीं बदला जा सकता है)। यह एक कथन नहीं है जैसा कि सी # - let
में केवल एक अन्य अभिव्यक्ति के हिस्से के रूप में उपयोग किया जा सकता है। उदाहरण के लिए:
let n = 10
n + n
वास्तव में मतलब है कि आप n
प्रतीक अभिव्यक्ति n + n
में मूल्य 10
का उल्लेख करना चाहते हैं। - इस तरह से let
का उपयोग कर अनुमति नहीं है
for x in seq_ do
let list_ = list_ @ [x] // This isn't assignment!
list_
समस्याग्रस्त लाइन एक अधूरी अभिव्यक्ति है: अपने कोड के साथ समस्या यह है कि आप किसी भी अभिव्यक्ति के बिना let
उपयोग कर रहे हैं (शायद इसलिए कि आप अस्थायी चर का उपयोग करना चाहते हैं) है , क्योंकि इसमें कोई अभिव्यक्ति नहीं है (list_
मान किसी भी कोड से नहीं पहुंचाया जाएगा)। आप अपने कोड को दूर करने के mutable
चर का उपयोग कर सकते हैं:
let mutable list_ = [] // declared as 'mutable'
let seq_ = seq { for x in 1..n do if x % 2 <> 0 then yield List.nth l (x-1)}
for x in seq_ do
list_ <- list_ @ [x] // assignment using '<-'
अब, यह काम करना चाहिए, लेकिन यह क्योंकि आप जरूरी उत्परिवर्तन का उपयोग कर रहे हैं, वास्तव में कार्यात्मक नहीं है। इसके अलावा, @
का उपयोग कर तत्वों को जोड़ना कार्यात्मक भाषाओं में वास्तव में अक्षम करने योग्य चीज है। इसलिए, यदि आप अपना कोड कार्यात्मक बनाना चाहते हैं, तो आपको शायद अलग-अलग दृष्टिकोण का उपयोग करने की आवश्यकता होगी। दोनों अन्य उत्तरों एक महान दृष्टिकोण दिखाते हैं, हालांकि मैं जोएल द्वारा उदाहरण पसंद करता हूं, क्योंकि सूची में अनुक्रमण (कैओस द्वारा समाधान में) भी बहुत कार्यात्मक नहीं है (कोई पॉइंटर अंकगणित नहीं है, इसलिए यह भी धीमा हो जाएगा) ।
शायद सबसे शास्त्रीय कार्यात्मक समाधान List.fold
समारोह है, जो एक एकल परिणाम में सूची के सभी तत्वों को एकत्रित करती है, बाएं से सही करने के लिए चलने के लिए उपयोग करने के लिए होगा:
[1;2;3;4;5]
|> List.fold (fun (flag, res) el ->
if flag then (not flag, el::res) else (not flag, res)) (true, [])
|> snd |> List.rev
इधर, राज्य के लिए इस्तेमाल किया दौरान एकत्रीकरण एक बूलियन फ़्लैग को निर्दिष्ट करके अगले तत्व शामिल करने के लिए है कि क्या है (प्रत्येक चरण के दौरान, हम not flag
वापस लौट कर झंडा फ्लिप)। दूसरा तत्व अब तक एकत्रित सूची है (हम el::res
द्वारा तत्व जोड़ते हैं, जब flag
सेट होता है। fold
रिटर्न के बाद, हम snd
का उपयोग टुपल (समेकित सूची) का दूसरा तत्व प्राप्त करने के लिए करते हैं और List.rev
का उपयोग करके इसे उलट देते हैं, क्योंकि यह उल्टा क्रम में एकत्र किया गया था (यह [email protected][el]
का उपयोग कर अंत में जोड़ने से अधिक कुशल है)
सूची का आकार = 1000; Iterations = 100; परिणाम (कैओसपैंडियन) = 4200ms; परिणाम (जोएल म्यूएलर) = 150ms; – ChaosPandion
टॉमस की 'List.fold' दृष्टिकोण के बारे में कैसे? –
वह लगभग 135 एमएमएस में आया था। – ChaosPandion