let result =
items
|>List.scan (fun (removed, _) item ->
if removed then true, Some(item) //If already removed, just propagate
elif predicate item then true, None //If not removed but predicate matches, don't propagate
else false, Some(item)) //If not removed and predicate doesn't match, propagate
(false, None)
|>List.choose snd
राज्य एक ट्यूपल है। पहला तत्व एक बूलियन ध्वज है जो दर्शाता है कि क्या हमने सूची से कुछ आइटम हटा दिया है या नहीं। दूसरा तत्व एक विकल्प है: कुछ जब हम आइटम को उत्सर्जित करना चाहते हैं, अन्यथा कोई नहीं।
अंतिम पंक्ति राज्यों से दूसरे तत्व लेती है और उनमें से प्रत्येक के लिए लपेटा हुआ मूल्य (कुछ के मामले में) उत्सर्जित करता है या कुछ भी नहीं (किसी के मामले में) नहीं करता है।
गार्ड क्लॉज अच्छा हो सकता है, लेकिन इस मामले में मुझे लगता है कि वे इसे और अधिक भ्रमित कर देते हैं। मुझे लगता है कि बस '| एच :: टी -> यदि एच को पूर्व निर्धारित करें (List.rev acc) @ t else loop (h :: acc) t' अधिक स्पष्ट है। – mydogisbox
इस उत्तर का एक लाभ यह है कि जब पहला मिलान मूल्य पहुंच जाता है तो यह प्रसंस्करण बंद कर देता है ताकि यह बहुत से काम को बचा सके। – TheQuickBrownFox
पूंछ-पुनरावर्ती संस्करण में आप '[] 'केस को संचयक को उलट करने के बजाय इनपुट' सूची' वापस करने के लिए बदल सकते हैं, जो कि वैसे भी उलट सूची है। – TheQuickBrownFox