में फ़ोल्डलिफ्ट का उपयोग करके करीबी फ़ंक्शन पर एक तर्क सूची लागू करना क्या तर्कों की सूची पर foldLeft
करना संभव है, जहां गुना को दिया गया प्रारंभिक मान पूरी तरह से घुमावदार फ़ंक्शन है, ऑपरेटर apply
है, और सूची है कार्य f
पर पास किए जाने वाले तर्कों की एक सूची?स्कैला
scala> val f = (i: Int, j: Int, k: Int, l: Int) => i+j+k+l
f: (Int, Int, Int, Int) => Int = <function4>
कौन सा हम निश्चित रूप से सीधे उपयोग कर सकते हैं:
scala> f(1, 2, 3, 4)
res1: Int = 10
या करी और एक समय में तर्क लागू:
उदाहरण के लिए, मान लीजिए कि च परिभाषित किया गया है के रूप में करते हैं
scala> f.curried
res2: Int => Int => Int => Int => Int = <function1>
scala> f.curried.apply(1).apply(2).apply(3).apply(4)
res3: Int = 10
पहली नज़र में यह foldLeft
के लिए नौकरी की तरह दिखता है।
मेरे foldLeft
का उपयोग कर apply
के इस क्रम का वर्णन पहला प्रयास लगता है:
scala> List(1, 2, 3, 4).foldLeft(f.curried)({ (g, x) => g.apply(x) })
हालांकि
, कि निम्न त्रुटि पैदावार:
<console>:9: error: type mismatch;
found : Int => Int => Int => Int
required: Int => Int => Int => Int => Int
List(1, 2, 3, 4).foldLeft(f.curried)({ (g, x) => g.apply(x) })
त्रुटि संदेश के मेरे पढ़ने कि प्रकार निष्कर्ष है g
के लिए कुछ संकेत की आवश्यकता होगी।
समाधान के लिए मैं देख रहा हूँ सब कुछ अपने मूल अभिव्यक्ति में असंशोधित छोड़ देता है g
के प्रकार को छोड़कर:
List(1, 2, 3, 4).foldLeft(f.curried)({ (g: ANSWER, x) => g.apply(x) })
मेरी पहली सोचा था कि एक संघ प्रकार यहाँ उपयोगी होगा। मैंने माइल्स सबिन को करी-हॉवर्ड का उपयोग करके यूनियन प्रकारों का व्युत्पन्न देखा है, इसलिए यदि वह पहला झुकाव सच है, तो मुझे समस्या को हल करने के लिए आवश्यक मूल मशीनरी दिखाई देती है।
हालांकि: यहां तक कि यदि यूनियन प्रकार का उत्तर है तो यह उपयोगी होगा यदि मैं "सभी प्रकार के संघ को एक समारोह के पूरी तरह से घुमावदार प्रकार से सभी के साथ विवाहित कार्य के प्रकार के साथ संदर्भित करता हूं लेकिन अंतिम तर्क दिया गया है "। संघ प्रकार में
T1 => ... => Tn
: दूसरे शब्दों में, एक तरह से प्रकार चालू करने के लिए
(T1 => ... => Tn) |∨| ... |∨| (Tn-1 => Tn)
ऊपर g
के लिए प्रकार के रूप में उपयोगी होगा।
एक List
पर एक foldLeft
कर चर्चा मामला है, जहां T1
Tn-1
के माध्यम से सभी एक ही हैं सीमित करता है।
(T1 =>)+ Tn
उस प्रकार का वर्णन करेगा जो मैं g
के लिए प्रदान करना चाहता हूं।
विशेष मामले के बारे में मैं मनमाने ढंग से लंबी श्रृंखला की आवश्यकता नहीं है पूछ रहा हूँ, इसलिए हम
(T1 =>){1,4} Tn
कि नहीं कर रहे हैं प्रकार की जंजीरों के लिए ऐसा करने के लिए इच्छुक में आगे देखते हुए का उपयोग कर पुनरावर्तक पर सीमा प्रदान कर सकता है बराबर है, हालांकि, शायद प्रकार पर कुछ जादुई समारोह है कि सभी प्रत्यय सेट में श्रृंखला को कांट-छांट और अधिक उपयोगी है:
Suffixes(T1 => ... => Tn)
को लागू यह अच्छी तरह से इस समय मेरी स्काला क्षमता से परे है। ऐसा करने के बारे में कोई संकेत नहीं है कि इसकी सराहना की जाएगी। चाहे यह स्कैला के मौजूदा प्रकार सिस्टम या कंपाइलर प्लगइन के माध्यम से या न तो उन्नत उपयोग के साथ किया जा सकता है या नहीं, मुझे नहीं पता।
जैसा कि नीचे दी गई टिप्पणियों में उल्लेख किया गया है, परिणाम को "यूनियन टाइप" इस उपयोग के मामले के लिए एकदम सही फिट नहीं है। मुझे नहीं पता कि इसे और क्या कहना है, लेकिन इस समय मेरे पास सबसे नज़दीकी विचार है। क्या इस भाषा के लिए अन्य भाषाओं का विशेष समर्थन है? यह कोक और आगादा में कैसे काम करेगा?
इस समस्या का नामकरण और समझना कि यह बड़ी तस्वीर (प्रकार सिद्धांत, निर्णय, और आगे के आगे) के संबंध में बैठता है, ANSWER
के कामकाजी कार्यान्वयन के मुकाबले मेरे लिए अधिक महत्वपूर्ण है, हालांकि दोनों अच्छे होंगे। बोनस उन सभी को इंगित करता है जो सामान्य रूप से स्कालाज़, मोनोइड्स या श्रेणी सिद्धांत से कनेक्शन खींच सकते हैं।
मुझे यकीन है कि संघ प्रकार यहां जाने का रास्ता नहीं है नहीं कर रहा हूँ। ऐसा लगता है कि आप एचएलिस्ट के रूप में प्रतिनिधित्व किए गए तर्कों पर करीबी कार्य की एक गुना जैसी चीज के बाद हैं। मुझे लगता है कि ऐसा कुछ संभवतः करने योग्य है। किसी भी तरह, यह एक दिलचस्प समस्या है ... यदि मैं कुछ भी काम करने योग्य हूं तो मैं जांच करूँगा और ठीक से जवाब दूंगा। –
वाह - धन्यवाद, माइल्स। मुझे यह सुनना अच्छा लगेगा कि आप इस समस्या के बारे में क्या करते हैं। मैं मानता हूं कि यूनियन प्रकार, प्रति से, ऐसा नहीं लगता है कि इस स्थिति में क्या कहा जाता है। –
@ माइल्ससबिन मैंने अपने प्रश्न को स्पष्ट किया है और कुछ रूपों को व्यक्त किया है जो एक उत्तर ले सकते हैं। मैं अभी भी अस्पष्ट हूं कि यह संभव है या नहीं होना चाहिए, लेकिन किसी भी तरह से यह मुझसे बात करने के लिए एक अच्छा अभ्यास रहा है। –