पॉइंटफ्री में ट्यूपल जोड़


16

सबसे छोटा तरीका क्या है हम फ़ंक्शन को व्यक्त कर सकते हैं

f(a,b)(c,d)=(a+c,b+d)

बिंदु-रहित संकेतन में?

pointfree.io हमें देता है

uncurry (flip flip snd . (ap .) . flip flip fst . ((.) .) . (. (+)) . flip . (((.) . (,)) .) . (+))

जिसके साथ थोड़े से काम को छोटा किया जा सकता है

uncurry$(`flip`snd).((<*>).).(`flip`fst).((.).).(.(+)).flip.(((.).(,)).).(+)

76 बाइट्स के लिए। लेकिन इस तरह के एक सरल कार्य के लिए यह अभी भी बहुत लंबा और जटिल लगता है । वहाँ किसी भी तरह से हम एक छोटे बिंदु मुक्त समारोह के रूप में जोड़ जोड़ व्यक्त कर सकते हैं?

पॉइंट-फ़्री से मेरा क्या मतलब है, यह स्पष्ट करने के लिए, फ़ंक्शन के एक पॉइंट-फ्री डिक्लेरेशन में मौजूदा फ़ंक्शंस और ऑपरेटर्स को शामिल करना और उन्हें एक-दूसरे को इस तरह से लागू करना शामिल है कि वांछित फ़ंक्शन बनाया जाता है। बैकटिक, कोष्ठक और शाब्दिक मूल्यों ( [], 0, [1..3], आदि) की अनुमति है, लेकिन जैसे कीवर्ड whereऔर letनहीं कर रहे हैं। इसका मतलब है की:

  • आप किसी भी चर / कार्यों को असाइन नहीं कर सकते हैं

  • आप लैम्ब्डा का उपयोग नहीं कर सकते हैं

  • आप आयात नहीं कर सकते

यहां एक ही सवाल है कि यह सीएमसी कब था


9
मुझे कभी समझ में नहीं आया कि इसे "बिंदु- मुक्त " क्यों कहा जाता है जब यह वास्तव में अंकों से भरा होता है। : पी
श्री एक्सकोडर


5
यह शर्म की बात है कि हमें सबसे अच्छा हास्केल पैकेज आयात करने की अनुमति नहीं है , अन्यथा समाधान बस होगा (+)***(+)
सिल्वियो मायोलो

2
एक विचार: (+)<$>([1],2)<*>([3],4)देता है ([1,3],6)
xnor

2
मैंने कुछ समय व्यतीत करने के लिए एक अच्छा समाधान तैयार करने की कोशिश में बिताया है, जो कि xnor की टिप का उपयोग कर रहा है ... लेकिन मैंने इस कचरे को समाप्त कर दिया । मैं यह भी नहीं जानता कि मैं कभी-कभी कोशिश क्यों करता हूँ ...
13

जवाबों:



8

44 बाइट्स

-8 बाइट्स अर्जन जोहान्सन को धन्यवाद। -3 बाइट्स ब्रूस फोर्ट के लिए धन्यवाद।

(.).flip(.)<*>(zipWith(+).)$mapM id[fst,snd]

इसे ऑनलाइन आज़माएं!

इसके लिए अनुवाद:

f t1 t2 = zipWith (+) (mapM id [fst, snd] $ t1) (mapM id [fst, snd] $ t2)

67 बाइट्स

-8 बाइट्स अर्जन जोहान्सन को धन्यवाद। -1 बाइट थैंक्स टू ब्रूस फोर्ट।

यदि टपल आउटपुट आवश्यक है:

(((,).head<*>last).).((.).flip(.)<*>(zipWith(+).)$mapM id[fst,snd])

इसे ऑनलाइन आज़माएं!

हाँ, मुझे मैन्युअल रूप से यह पके फल का उत्पादन नहीं करता है। लेकिन मैं [a] → (a, a)रूपांतरण से खुश हूं ।

listToPair  [a]  (a, a)
listToPair = (,) . head <*> last
-- listToPair [a, b] = (a, b)

अब अगर साथ में कोई छोटा फंक्शन था m (a → b) → a → m b


3
इसे आप से नफरत करने के लिए, लेकिन mapM id[fst,snd]कम है।
अर्जन जोहान्स

अफसोस की बात है, आप जिस फ़ंक्शन की तलाश कर रहे हैं , mapM idउसका गोल्फ संस्करण है sequence
अर्जन जोहान्स

हाँ यह सच है। मैं सिर्फ (<*>)हस्ताक्षर देख रहा हूँ जो है m (a → b) → m a → m b। इतना करीब ...
बुतपरस्त

1
वहाँ भी है Control.Lens.??, जो कुछ बिंदु पर आधार में शामिल करने के लिए प्रस्तावित किया गया हो सकता है।
अर्जन जोहान्स

मैं बार-बार की (.mapM id[fst,snd])तरह एक्सट्रैक्ट करना चाहता हूं let r=(.mapM id[fst,snd]) in r(r.zipWith(+)), लेकिन मैं एक पॉइंटफ्री वर्जन को स्वीकार करने के लिए टाइपकास्ट नहीं कर पाया।
xnor

4

54 बाइट्स

मुझे ईमानदारी से संदेह है कि हम @ H.PWiz के 44 बाइट्स समाधान को हरा देंगे, लेकिन कोई भी इस तथ्य का उपयोग नहीं कर रहा था कि (,)प्रकार वर्ग को लागू करता है Functor, इसलिए यहां एक और दिलचस्प है जो बहुत बुरा नहीं है:

((<*>snd).((,).).(.fst).(+).fst<*>).flip(fmap.(+).snd)

इसे ऑनलाइन आज़माएं!

व्याख्या

2- टुपल्स के Functorलिए टाइप क्लास का क्रियान्वयन आधार ( 4.10.1.0 से ) के समान है:Either

instance Functor ((,) a) where
    fmap f (x,y) = (x, f y)

instance Functor (Either a) where
    fmap _ (Left x) = Left x
    fmap f (Right y) = Right (f y)

इस चुनौती के लिए इसका क्या मतलब है, यह है कि निम्नलिखित फ़ंक्शन दूसरे तत्व को जोड़ते हुए दूसरे तर्क का पहला तत्व रखता है:

λ f = fmap.(+).snd :: Num a => (a, a) -> (a, a) -> (a, a)
λ f (1,-2) (3,-4)
(3,-6)

इसलिए अगर केवल हमें कुछ मदद मिलती है helpPlz = \a b -> (fst a+fst b,snd b)तो हम कर सकते हैं (helpPlz<*>).flip(fmap.(+).snd)और किया जाएगा। सौभाग्य से हमारे पास उपकरण है pointfreeजो हमें देता है:

helpPlz = (`ap` snd) . ((,) .) . (. fst) . (+) . fst

तो बस उस फ़ंक्शन को वापस प्लग करके हम उपरोक्त समाधान ( (<*>) = apजो कि आधार में है ) पर पहुंचें ।


4

60 बाइट्स

मुझे uncurryयहां कोई प्यार नहीं दिख रहा है, इसलिए मुझे लगा कि मैं इसमें आकर ठीक कर दूंगा।

uncurry$(uncurry.).flip(.)(flip(.).(+)).(flip(.).((,).).(+))

मैंने सोचा, सभी के साथ fstऔर snd, कि तर्क को खोलना uncurryकुछ परिणाम दे सकता है। जाहिर है, यह उतना फलदायी नहीं था जितना मैंने उम्मीद की थी।


2
uncurryइतनी क्रिया है। :( लेकिन आप सबसे बाहरी कोष्ठक को बदल सकते हैं $
अर्जन जोहानसन

हाँ, और यह दुर्भाग्य से हास्केल में बहुत सारे फ़ंक्शन नामों का मुद्दा है। गोल्फ खेलने के लिए बस बहुत लंबा है। लेकिन 1-चरित्र बचत के लिए धन्यवाद!
सिल्वियो मायोलो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.