2009-11-05 19 views
23

मैंने पाया निम्नलिखित

(%) = flip fmap 

को परिभाषित मैं निम्नलिखित की तरह कोड लिख सकते हैं: तो

readFile "/etc/passwd" % lines % filter (not . null) 

मेरे लिए यह बनाता है और अधिक समझ में वैकल्पिक

filter (not . null) <$> lines <$> readFile "/etc/passwd" 

स्पष्ट रूप से यह सिर्फ आदेश का मामला है, क्या कोई और ऐसा करता है? क्या इस तरह के कोड लिखने का कोई वैध कारण नहीं है?

+5

इस के लिए अधिक आम नाम शायद है '' '' '' <&> निम्नलिखित '' '(&) = ($)' '' लेंस द्वारा फ्लिप। – fread2281

उत्तर

5

वहाँ Applicative typeclass <**> कहा जाता है के लिए एक समान कार्य है, यह फंक्टर के लिए भी चाहते हैं या उपयोग करने के लिए एक पूरी तरह से उचित बात है। दुर्भाग्यवश, अर्थशास्त्र <**> के लिए थोड़ा अलग हैं, इसलिए इसे Functor पर भी लागू करने के लिए सीधे विस्तृत नहीं किया जा सकता है।

4
-- (.) is to (<$>) as flip (.) is to your (%). 

मैं आमतौर पर परिभाषित करते हैं (&) = फ्लिप (।) और यह सिर्फ अपने उदाहरण की तरह है, तो आप समारोह रचना backwords आवेदन कर सकते हैं। मेरी राय में अंक-मुक्त कोड को समझने में आसान बनाता है।

+5

तीर संयोजक (>>>) भी है जो कार्यों के लिए (फ्लिप (।)) जैसा है – Will

+0

धन्यवाद श्रीमान! आयात बॉयलरप्लेट के अलावा, यह उपयोगी होगा इसलिए मैं मानक कोड रख सकता हूं। – codebliss

+1

ध्यान दें कि लेंस को परिभाषित करता है '' '(&) = फ्लिप ($)' '' – fread2281

3

व्यक्तिगत तौर पर मैं इस तरह के एक ऑपरेटर का उपयोग नहीं करेंगे, क्योंकि तब मैं जिसमें कार्यक्रमों को पढ़ने के लिए दो आदेश सीखना चाहिए।

+1

सुनिश्चित नहीं हैं कि मैं इस तर्क को काफी आकर्षक लगता है, लेकिन यह देखने का एक दिलचस्प बात है, तो +1 है। जिज्ञासा से बाहर: क्या आप इसी कारण से '= <<' over '>> =' पसंद करते हैं? – Stephan202

+1

मैं निश्चित रूप से करता हूं! – copumpkin

+1

मैंने पिछले कथन को कभी नहीं समझा। ऐसा लगता है कि मानक नोटेशन का उपयोग कर समझ में आता है क्योंकि यह यूनिक्स पाइपिंग की तरह है? – codebliss

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