2013-09-28 5 views
9

च की संरचना और जी कि लग रहा हैएक आम पैटर्न कार्यों की संरचना ( एक ख -> च (छ क) (छ ख)) को शामिल

f :. g = \a b -> f (g a) (g b) 

की तरह एक पैटर्न मैं अपने कोड में बहुत बार लगता है। यह यूनरी फ़ंक्शन संरचना के समान है, केवल f बाइनरी है और मैं gf पर जाने से पहले दोनों तर्कों पर लागू होना चाहता हूं।

जब मैं बिंदु से मुक्त रूप में बदलने के लिए lambdabot से पूछते हैं, मैं अजीब जादू

जो मैं अपने कोड में नहीं था मिलता है, तो मैं अंत में सिर्फ़ स्पष्ट पैटर्न लिखने ।

क्या इस स्थिति के लिए एक संयोजक लिखने का एक आम तौर पर स्वीकार्य तरीका है? या मैं इस स्थिति में खुद को खोजने के लिए अजीब हूँ?

मेरे पास इसका सही उदाहरण नहीं है जब मैं इसे हाथ से उपयोग करता हूं क्योंकि मैंने कभी इसकी आवश्यकता होने पर यहां कभी नहीं पूछने के लिए सोचा है, लेकिन कोई भी इसके साथ बहुत अच्छी तरह से यूक्लिडियन दूरी सूत्र लिखने की कल्पना कर सकता है, इसलिए जैसे:

distance = sqrt . (+) :. (^2) 
+2

'flip' समाप्त किया जा सकता:' (छ।)। एफ जी' –

उत्तर

24

इस समारोह Data.Function मॉड्यूल में on कहा जाता है।

अक्सर इनफिक्स का उपयोग किया जाता है, जैसे sqrt . (+) `on` (^2)

+2

मुझे विश्वास नहीं है कि मैंने इस बारे में नहीं सोचा था! बहुत बहुत धन्यवाद। – kqr

+0

उपयोग का एक आम उदाहरण है 'sortBy (\ 'abs \' abs 'पर'' –

+0

'मैं भविष्य के Google लोगों के लिए नोट करूंगा कि' abs की तुलना ''' '' '' '' '' '' 'की तुलना में अधिक मूर्खतापूर्ण है। यह काम करता है क्योंकि 'comparing = तुलनात्मक' मानक पुस्तकालयों में कहीं परिभाषित किया गया है। – kqr

2

इसे पॉइंट फ्री स्टाइल में लिखने की कोशिश न करें। यह इस तथ्य का एक उदाहरण है कि पॉइंट-फ्री अक्सर पठनीय नहीं होता है।

बस इसे thusly परिभाषित:

(:.) :: (b -> b -> c) -> (a -> b) -> (a -> a -> c) 
infixr 9 (:.) 
f :. g x y = f (g x) (g y) 
+0

यहां एक इंफिक्स ऑपरेटर संदिग्ध है, खासकर जब से कई '(.'' या '।:' '(।) के लिए उपयोग करते हैं। (।) ' – jozefg

+0

@jozefg मैसेंजर को शूट न करें - यह प्रश्न में इस्तेमाल ओपी का प्रतीक है। –

+0

@jozefg मैंने जानबूझकर ': .' को समानांतर के रूप में चुना है। '' जिसका उपयोग अक्सर उल्लू ऑपरेटर के लिए किया जाता है। मैं इसे '।:' के रूप में देखता हूं, बाईं ओर एक तर्क का एक फ़ंक्शन लेता है (इसलिए डॉट) और दाईं ओर दो तर्कों का एक फ़ंक्शन (इसलिए डबल डॉट्स) - इसलिए ': .' को दो तर्कों का कार्य करना चाहिए बाईं तरफ और दाईं तरफ एक तर्क का एक समारोह। – kqr

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