2013-02-09 55 views
6

अंकों की एक स्ट्रिंग को देखते हुए, मैं स्ट्रिंग में अपनी स्थिति के साथ गैर-शून्य अक्षरों को मैप करने वाले टुपल्स का अनुक्रम प्राप्त करना चाहता हूं। उदाहरण:क्या कोई लाइब्रेरी फ़ंक्शन या ऑपरेटर टुपल बनाने के लिए है?

IN: "000140201" 
OUT: { (3, '1'); (4, '4'); (6, '2'); (8, '1') } 

समाधान:

let tuples = source 
      |> Seq.mapi (fun i -> fun c -> (i, c)) 
      |> Seq.filter (snd >> (<>) '0') 

ऐसा लगता है (fun i -> fun c -> (i, c)) की तरह एक बहुत अधिक टाइपिंग की तुलना में यह इस तरह के एक सरल और शायद आम आपरेशन के लिए होना चाहिए। यह आवश्यक समारोह की घोषणा करने के लिए आसान है:

let makeTuple a b = (a, b) 
let tuples2 = source 
       |> Seq.mapi makeTuple 
       |> Seq.filter (snd >> (<>) '0') 

लेकिन यह है कि अगर पुस्तकालय snd समारोह प्रदान करता है, यह भी makeTuple समारोह प्रदान करना चाहिए मुझे लगता है (और शायद छोटे नाम के साथ), या कम से कम यह होना चाहिए लिखने के लिए अपेक्षाकृत आसान हो। मुझे यह नहीं मिला; क्या मैं कुछ भूल रहा हूँ? मैंने ढांचे के टुपल के साथ कुछ बनाने की कोशिश की। क्रेट, लेकिन मैं यह नहीं समझ सका कि एकल-तर्क अधिभार के अलावा कुछ और कैसे प्राप्त करें।

+5

मामूली सुधार 'Seq.mapi (मजेदार ab -> ए, बी)' –

+0

@ जॉन पामर आह, धन्यवाद।मैंने सोचा कि मुझे पहले उस वाक्यविन्यास में कोई त्रुटि थी, लेकिन मुझे लगता है कि त्रुटि किसी और चीज के कारण हुई थी। – phoog

+1

इसके अलावा, '||>' ऑपरेटर के विपरीत है जो आप चाहते हैं। –

उत्तर

7

लेकिन ऐसा लगता है कि यदि पुस्तकालय एसएनडी फ़ंक्शन प्रदान करता है, तो इसे मेक टुपल फ़ंक्शन भी प्रदान करना चाहिए।

एफ # मानता है कि आप उन्हें रचना से tuples (fst, snd का प्रयोग करके) विघटित अधिक बार। कार्यात्मक पुस्तकालय डिजाइन अक्सर न्यूनतम सिद्धांत का पालन करता है। सामान्य उपयोग के मामलों के लिए बस कार्य प्रदान करें, अन्य कार्यों को परिभाषित करना आसान होना चाहिए।

मुझे यह नहीं मिला; क्या मैं कुछ भूल रहा हूँ?

नहीं, आप नहीं हैं। यह वही कारण नहीं है कि FSharpxtuple2, tuple3 परिभाषित किया गया है, आदि यहाँ सीधे Prelude से उपयोगिता कार्य:

/// Creates a pair 
let inline tuple2 a b = a,b 
/// Creates a 3-tuple 
let inline tuple3 a b c = a,b,c 
/// Creates a 4-tuple 
let inline tuple4 a b c d = a,b,c,d 
/// Creates a 5-tuple 
let inline tuple5 a b c d e = a,b,c,d,e 
/// Creates a 6-tuple 
let inline tuple6 a b c d e f = a,b,c,d,e,f 

मैं ढांचे के Tuple.Create के साथ कुछ का निर्माण करने की कोशिश की, लेकिन मैं समझ नहीं सकता एकल-बहस अधिभार के अलावा कुछ और कैसे प्राप्त करें।

एफ # संकलक System.Tuple<'T1, 'T2> के गुणों tuples पर मुहावरा मिलान पैटर्न लागू करने के लिए छुपाता है। अधिक जानकारी के लिए Extension methods for F# tuples देखें।

उस ने कहा, एफ # में पॉइंट-फ्री स्टाइल की हमेशा अनुशंसा नहीं की जाती है। यदि आपको पॉइंट-फ्री पसंद है, तो आपको खुद को भारी उठाने के लिए थोड़ा सा करना होगा।

2

@ पैड का जवाब, बहुत अच्छा है सिर्फ मेरी 2 सेंट जोड़ने के लिए: मैं समान ऑपरेटर

let inline (-&-) a b = (a, b) 

उपयोग कर रहा हूँ और यह let x = a -&- b

लिखने के लिए हो सकता है कि आप इस ऑपरेटर मिल जाएगा बहुत सुविधाजनक लग रहा है उपयोगी भी