2012-04-04 15 views
18

मेरे पास एक ऐसा फ़ंक्शन है जिसका मैं अक्सर उपयोग करता हूं, जो मुझे मेरे कोड को ऐसे तरीके से लिखने की अनुमति देता है जो मेरे लिए अधिक प्राकृतिक लगता है।हास्केल फ़ंक्शन बाएं से दाएं

infixl 6 $: 
($:) :: a -> (a -> b) -> b 
a $: f = f a 

यह मैं

let x = getData 
     $: sort 
     $: group 
     $: aggregate 
बजाय

let x = aggregate 
     $ group 
     $ sort 
     $ getData 

मैं हाल ही में पता चला Clojure इस में (मैं बहुत Clojure पता नहीं है बनाया की तरह कुछ है ऐसा ही कुछ करने की सुविधा देता है, लेकिन मुझे लगता है कि यह (-> getData sort group aggregate) लिखा जाएगा?) जो मुझे आश्चर्यचकित करता है कि हास्केल ने इसे भी बनाया है। हालांकि होगल doesn't have any results

क्या कुछ मानक शामिल हैं जिसमें कुछ समान शामिल है? अगर संभवतः मेरे पास ऐसा आम हिस्सा मूर्खतापूर्ण है तो यह शायद मेरे कोड को पढ़ने के लिए कठिन बनाता है।

+5

मेरी प्राथमिकता, इस आपरेशन 'OOHaskell के अनुसार #' कॉल करने के लिए है, क्योंकि यह मौलिक वस्तुओं पर विधि चयन और '#' रूप में एक ही आपरेशन है इस के लिए इस्तेमाल किया ऑपरेटर है ओकैमल में वैकल्पिक रूप से, एफ # की प्रतिलिपि बनाकर हम '|>' –

+1

आरेखों का उपयोग # # भी कर सकते हैं। – Long

+1

Data.Function को 'फ्लिप ($)' को शुरू करने के लिए एक प्रस्ताव था, लेकिन क्योंकि कोई आम सहमति नहीं है करने के लिए (शुरुआती आदि को भ्रमित करने का विरोध किया) क्या ऐसी बात उपयोगी होगा पर पहुँचा जा सकता है यह हटा दिया गया था। यहाँ चर्चा है: http://markmail.org/message/vsplpb7aajp7goqo?q=python – David

उत्तर

22

इस में बनाया तरह कुछ भी नहीं है, लेकिन Control.Category.(>>>) करीब है: यह, flip (.) है ताकि आप

f x = x $: sort $: group $: aggregate 

रूप

f = sort >>> group >>> aggregate 

आपके ($:) Combinator के लिए no shortage of definitions and names है लिख सकते हैं। मुझे लगता है कि फ़ंक्शन सरल अनुप्रयोगों की तुलना में पाइपलाइन शैली के अनुरूप होते हैं, इसलिए मुझे इसके लिए कोई बड़ी आवश्यकता नहीं है; (>>>) हालांकि थोड़ा बदसूरत है।

(इसके अलावा, हास्केल के गैर सख्त अर्थ विज्ञान का मतलब है कि डेटा का प्रवाह दिशा तीरों यहाँ इंगित कर रहे हैं में जरूरी नहीं है, इससे पहले कि sort भी को देखने के लिए एक मौका हो जाता है सब के बाद, aggregate पहले निर्माता प्रदान कर सकता है । तर्क तो मैं सिर्फ (.) और ($) का उपयोग करते हैं, मैं आदेश करने के लिए इस्तेमाल कर रहा हूँ)

+2

बदसूरत या नहीं मुझे लगता है (>>>) अंतर्ज्ञानी है क्योंकि ऐसा लगता है (>> =), जो एक समान बाएं से दाएं पाइपलाइन है। – amindfv

+0

बहुत बुरा यह 'फ्लिप ($) 'के बजाय' फ्लिप (।)' है। लेकिन मुझे लगता है कि '>>>' उतना करीब है जितना आप प्राप्त कर सकते हैं। – Xodarap

+0

http://hackage.haskell.org/packages/archive/diagrams-lib/0.4.0.1/doc/html/Diagrams-Util.html से भी (#) भी है, लेकिन इसकी तुलना में बहुत अलग infix प्राथमिकता है ($)। – mgsloan

3

रिवर्स आवेदन ऑपरेटर अपने का वर्णन कर रहे हैं अब & operator के रूप में मानक पैकेज base (4.8.0 के बाद से का हिस्सा) है।।

ध्यान दें कि इस ऑपरेटर को आपके द्वारा प्रस्तावित एक से कम प्राथमिकता के साथ परिभाषित किया गया है (infixl 1)।

1

इस सटीक मांग के लिए टेलर फौसक द्वारा बनाई गई फ्लो (https://hackage.haskell.org/package/flow-1.0.10/docs/Flow.html) नामक एक लाइब्रेरी हैकेज में उपलब्ध है।

यह |> ऑपरेटर (एफ # से प्रेरित) एक धागे की पिछले के रूप में कार्य करने के लिए उपयोग करता है।

उदाहरण के लिए:

3 |> succ |> recip |> negate 
-0.25 
संबंधित मुद्दे