2016-02-24 2 views
6
a 
|>Seq.map fixLine 
|>Seq.map splitCells 
|>Seq.map getName 
|>Seq.where(fun a->not<|Seq.isEmpty a) 
|>Seq.map fixName 

Seq के बहुत से रहते हुए हमेशा इसे परेशान करें। रेखा के अंदर। उन्हें छोड़ देते हैं एक अच्छा तरीका सुझाएँ ..."सेक खोलने" या इसी तरह के प्रभाव के लिए कोई तरीका?

उदाहरण के लिए, सूचियों के लिए List.map उपयोग करते हैं, सिर्फ map seq के लिए उपयोग करें, या जब मैं seq और सूचियों का उपयोग कर रहा विभिन्न मॉड्यूल में उन्हें अलग हो गए।

a 
|>map fixLine 
|>map splitCells 
|>map getName 
|>where(fun a->not<|isEmpty a) 
|>map fixName 

वास्तव में बेहतर दिखता है।

+1

क्या आपने इसे आजमाया? यह काम नहीं करता है, लेकिन त्रुटि संदेश स्पष्ट रूप से इंगित करता है कि क्यों - मॉड्यूल जानबूझकर '[RequQualifiedAccess] 'विशेषता के साथ एनोटेट किया गया है। – kvb

+1

यदि आप [FSharpPlus] (https://github.com/gmpl/FSharpPlus) का संदर्भ देते हैं तो आपका कोड काम करेगा। आपको बस 'कहां' के बजाय 'फ़िल्टर' लिखना होगा। यह 'ए' के प्रकार के आधार पर, सरणी और सूचियों के साथ भी वैसे ही काम करेगा। – Gustavo

उत्तर

6

आप, साथ ही काम करता है आप चाहते हैं के लिए उपनाम निर्धारित कर सकते हैं अपने ऑपरेटरों को परिभाषित करके इसे और भी अधिक कर सकता है:

let (|!>) s f = Seq.map f s 
let (|*>) s f = Seq.filter f s 

a 
|!> fixLine 
|!> splitCells 
|!> getName 
|*> (fun a->not<|isEmpty a) 
|!> fixName 

लेकिन इस बिंदु पर, आपका कोड बहुत क्रिप्टिक बन जाता है - यानी कोड को देखने वाले किसी को यह समझने में कठिनाई होगी कि क्या हो रहा है।

और अंत में, आप मूल कोड बना सकता है देख कि map रों की एक रचना रचना की एक map है द्वारा एक सा बेहतर दिखेगा:

a 
|> Seq.map (fixLine >> splitCells >> getName) 
|> Seq.filter (not << isEmpty) 
|> Seq.map fixName 

यह समाधान है कि मैं व्यक्तिगत रूप से पसंद करेंगे है।


सामान्य तौर पर, मेरे निजी अनुभव बताता है कि, पहली आवेग के बावजूद दोहराए भागों खुद को छोटा करने से "ठीक" करने के लिए repetitiveness, वहाँ आमतौर पर एक बेहतर समाधान है कि आपके कोड केवल नहीं लग रही हो जाएगा है बेहतर, लेकिन बेहतर रूप से बेहतर भी।

+0

वाह, मुझे "' >> 'ऑपरेटर का उपयोग करने का तरीका मिला, धन्यवाद! –

+0

यदि दो उत्तरों में से कोई भी आपकी मदद करता है, तो क्या आप उनमें से एक को "स्वीकार" करेंगे? –

+0

मैं देखता हूं, मेरा सुझाव है कि यह अंतिम जवाब नहीं है, लेकिन यह सहायक है। –

4

मुझे नहीं लगता कि Seq को दोहराने से बचने का एक आसान तरीका है - यह केवल एक ही जगह है जहां F # चीजों को थोड़ा और स्पष्ट बनाता है (ताकि आप जानते हों कि क्या हो रहा है)।

लेकिन आप F# Core Fluent library जो आप . के साथ एक अधिक सी # तरह वाक्य रचना देता है का उपयोग कर सकते हैं:

let map = Seq.map 
let where = Seq.filter 

या आप:

a.map(fixLine).map(splitCells).map(getName).filter(isEmpty >> not).map(fixName) 
+0

समय पर जवाब के लिए बहुत बहुत धन्यवाद! –

संबंधित मुद्दे