नहीं, आप नहीं कर सकते। मूल समस्या यह है कि हास्केल के वाक्यविन्यास ने आपको यह सोचने में मूर्ख बना दिया है कि f1
और f2
के प्रकार वास्तव में उनके समान हैं। एक बार जब GHC कोर में अनुवाद किया, बल्कि वे अधिक अलग दिख:
f1 :: forall a . a -> [a]
f2 :: Int -> Int
केवल यही नहीं, लेकिन शर्तों बल्कि विभिन्न नज़र इसी:
f1 = Λa -> λ(x :: a) -> [x]
f2 = λ(x :: Int) -> 3 * x
आप देख सकते हैं, f1
और f2
वास्तव में है तर्कों की विभिन्न संख्या, जहां f1
टाइप और मान औरलेता हैसिर्फ एक मूल्य लेता है।
अधिक सामान्य परिस्थितियों में, जब आप एक संदर्भ प्रकार, कहते हैं, Int -> [Int]
के एक समारोह की उम्मीद में f2
खटखटाने, GHC आवश्यक प्रकार के f2
लागू होगी आप (यानी, एक विशिष्ट प्रकार के f2
का दृष्टांत) के लिए, और सभी इच्छा खुश रहो। उदाहरण के लिए, यदि आप
g :: (Int -> [Int]) -> Bool
है और आप f
को g
लागू होते हैं, GHC वास्तव में उस
g (f @Int)
को संकलित कर देगा लेकिन यहाँ आप पर है कि इन्स्टेन्शियशन होता है या नहीं, जो GHC नहीं करता है 'कि क्या बहुरूपता चाहते टी समर्थन (मुझे लगता है कि यह कोर भाषा में बल्कि एक कट्टरपंथी और विनाशकारी परिवर्तन होगा)।
कक्षा के उदाहरणों के बाद, परिवार के पैटर्न टाइप करें, और परिवार के परिणामों को टाइप करें, मुझे प्रमाणित नहीं किया जा सकता है, मुझे पूरा भरोसा है कि आप जो चाहते हैं उसे पाने के लिए कोई रास्ता नहीं है।
@ErikR के रूप में आपको दिखाया गया है कि अब (अब हटाया गया) जवाब बाएं हाथ की तरफ काम करने योग्य है लेकिन rhs पर प्रकार 'f' के प्रकार पर निर्भर करता है, इसलिए मुझे लगता है कि आपको टाइप-परिवारों का भी उपयोग करना होगा - यदि यह आपके लिए सही है, तो यह संभव है - निश्चित रूप से यह केवल एक अनुमान है - क्योंकि मुझे पता है कि इसे व्यक्त करने का एक तरीका है;) – Carsten
जीएचसी एक्सटेंशन का उपयोग करने में खुशी – Clinton
@ user3237465: एक त्वरित नज़र में (कम से कम आपका सरल संस्करण) मुझे लगता है कि आप 'f2' के साथ परेशानी में भाग लेंगे क्योंकि यह * * के लिए * नहीं है, लेकिन केवल' Int' के लिए – Carsten