हास्केल में सबसे कम ए -> बी -> ((ए - बी) फ़ंक्शन


19

मुझे एक परीक्षण में निम्नलिखित प्रश्न मिला:

fनिम्नलिखित प्रकार के साथ एक फ़ंक्शन लिखें a -> b -> (a -> b)aऔर bकिसी भी अर्थ में बाध्य नहीं होना चाहिए, कोड जितना छोटा होगा, उतना अच्छा होगा।

मैं साथ आ गया f a b = \x -> snd ([a,x],b)। क्या आपको कुछ टिनियर मिल सकता है?

वर्तमान में विजेता है: f _=(.f).const


यदि अधिक सामान्य प्रकार की अनुमति है f = const const:।
हमर

@ उमर: या f _ b _ = b, लेकिन, प्रश्न में समाधान दिए जाने पर, मुझे संदेह है कि अधिक सामान्य प्रकार की अनुमति नहीं है
तिखन जेल्विस

6
यदि अधिक सामान्य प्रकार की अनुमति है, तो क्यों नहीं f = id?
टॉम एलिस

7
वास्तव में यदि अधिक सामान्य प्रकार की अनुमति है तो f = fएक समाधान है, इसलिए मुझे लगता है कि प्रकार पर स्थितियां बहुत महत्वपूर्ण हैं!
टॉम एलिस

2
अधिक सामान्य प्रकार की अनुमति नहीं है, आपकी धारणा सही थी।
राडू स्टोनिस्को

जवाबों:


11

दाएं हाथ पर अनाम फ़ंक्शन से छुटकारा पाने से आपका उदाहरण सिकुड़ सकता है:

f a b x = snd ([a,x],b)

यह काम करता है क्योंकि प्रकार हास्केल में a -> b -> a -> bबराबर है a -> b -> (a -> b)


4
थोड़ा छोटा संशोधन:f a b x = snd (f x,b)
एडका

5

फ़ंक्शन f _=(.f).constवास्तव में f :: a -> b -> (a -> b), अर्थात् की तुलना में अधिक सामान्य प्रकार का है f :: a -> b -> (c -> b)। यदि कोई प्रकार का हस्ताक्षर नहीं दिया गया है, तो प्रकार की अनुमान प्रणाली एक प्रकार की होती है f :: a -> b -> (a -> b), लेकिन यदि आप f :: a -> b -> (c -> b)सटीक हस्ताक्षर को उसी परिभाषा के साथ शामिल करते हैं , तो Haskell इसे बिना किसी समस्या के संकलित करेगा और f के आंशिक अनुप्रयोगों के लिए सुसंगत प्रकारों की रिपोर्ट करेगा। शायद कुछ गहरे कारण है कि इस मामले में टाइप चेकिंग सिस्टम की तुलना में टाइप इंफ़ेक्शन सिस्टम कितना सख्त है, लेकिन मुझे यह समझने के लिए पर्याप्त श्रेणी सिद्धांत समझ में नहीं आता है कि ऐसा क्यों होना चाहिए। यदि आप असंबद्ध हैं, तो आप स्वयं इसका प्रयास करने के लिए स्वागत करते हैं।


के मामले की तरह हो सकता है f a b = f a a। यह टाइप का हो सकता है, a -> a -> bहालांकि यह टाइप का अनुपालन करता है a -> b -> c। यह इसलिए है क्योंकि अगर fइसे एक प्रकार नहीं दिया जाता है तो यह केवल खुद को मोनोमोर्फिक रूप से उपयोग कर सकता है।
घमंडी हैस्केलर

मुझे नहीं लगता कि इस पर कोई फर्क नहीं
पड़ना

4

दिया ScopedTypeVariables, मैं इस के साथ आया:

f (_::a) b (_::a) = b

यदि आप मेरे कार्य और आपके दोनों को छोटा करते हैं, तो मेरा बाल छोटा है:

f(_::a)b(_::a)=b
f a b x=snd([a,x],b)

बेशक, आपको शायद इस पर भरोसा करने की अनुमति नहीं है ScopedTypeVariables: पी।


3
यह उतना कम नहीं है जितना f _=(.f).const( सस्सा NF के कारण )। जिसकी जरूरत भी नहीं है ScopedTypeVariables
१२:१४ को

हम्म, मैंने शुरू में सोचा था कि इसके लिए पहले और तीसरे तर्क की सूची की आवश्यकता होगी ...
क्रिस टेलर

@ क्रिसट्रेलर: दिमाग पर बहुत अधिक OCaml? :)
तिकोन जेल्विस

हह, होना चाहिए! ;)
क्रिस टेलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.