मैं प्रकार के परिवारों के साथ अभिव्यक्तियों का प्रतिनिधित्व करने की कोशिश कर रहा हूं, लेकिन मुझे लगता है कि मैं जो बाधाओं को लिखना चाहता हूं, उसे समझने की प्रतीत नहीं कर रहा हूं, और मुझे ऐसा लगता है कि यह संभव नहीं है। यहां मेरा कोड है:प्रकार बाधाओं के साथ हास्केल प्रकार पारिवारिक उदाहरण
class Evaluable c where
type Return c :: *
evaluate :: c -> Return c
data Negate n = Negate n
instance (Evaluable n, Return n ~ Int) => Evaluable (Negate n) where
type Return (Negate n) = Return n
evaluate (Negate n) = negate (evaluate n)
यह सब ठीक से संकलित करता है, लेकिन यह बिल्कुल ठीक नहीं है जो मैं चाहता हूं। Negate
Evaluable
के उदाहरण की बाधाओं में, मैं कहता हूं कि Negate
के अंदर अभिव्यक्ति का वापसी प्रकार Int
(Return n ~ Int
के साथ) होना चाहिए ताकि मैं उस पर नकारात्मकता कह सकूं, लेकिन यह बहुत ही सीमित है। रिटर्न प्रकार वास्तव में केवल Num
प्रकार वर्ग का उदाहरण होना चाहिए जिसमें negate
फ़ंक्शन है। इस तरह Double
एस, Integer
एस, या Num
के किसी भी अन्य उदाहरण को भी अस्वीकार कर दिया जा सकता है और न केवल Int
एस। लेकिन मैं सिर्फ
Return n ~ Num
नहीं लिख सकते हैं बजाय क्योंकि Num
एक प्रकार वर्ग है और Return n
एक प्रकार है। मैं
Num (Return n)
इसके बजाय Return n
एक प्रकार का प्रकार नहीं है।
क्या मैं हास्केल के साथ भी संभव करने की कोशिश कर रहा हूं? यदि नहीं, तो क्या यह होना चाहिए, या क्या मैं इसके पीछे कुछ सिद्धांत गलत समझ रहा हूं? मुझे लगता है कि जावा इस तरह की बाधा डाल सकता है। अगर यह सवाल स्पष्ट हो तो मुझे बताएं।
संपादित करें: धन्यवाद दोस्तों, प्रतिक्रियाएं मदद कर रही हैं और मुझे संदेह है कि मुझे क्या संदेह है। ऐसा प्रतीत होता है कि टाइप चेकर बिना किसी अक्षमता के किए जो मैं करना चाहता हूं उसे संभालने में सक्षम नहीं है, इसलिए मेरा सवाल यह है कि मैं वास्तव में अपरिहार्य व्यक्त करना चाहता हूं? यह हास्केल कंपाइलर के लिए है, लेकिन यह सामान्य रूप से है? यानी एक बाधा भी अस्तित्व में हो सकती है जिसका मतलब है "जांचें कि रिटर्न एन न्यूम का उदाहरण है" जो एक और उन्नत प्रकार के चेकर के लिए निर्णायक है? बस Int
कर सकते हैं
{-# LANGUAGE TypeFamilies, FlexibleContexts, UndecidableInstances #-}
class Evaluable c where
type Return c :: *
evaluate :: c -> Return c
data Negate n = Negate n
instance (Evaluable n, Num (Return n)) => Evaluable (Negate n) where
type Return (Negate n) = Return n
evaluate (Negate n) = negate (evaluate n)
Return n
निश्चित रूप से एक प्रकार है, जो एक वर्ग का एक उदाहरण हो सकता है:
बीटीडब्ल्यू, जीएचसी ने कभी भी भाषा विस्तार की सिफारिश नहीं की, जैसे कि उदाहरण आपके परीक्षण और त्रुटि प्रक्रिया के दौरान 'फ्लेक्सिबल कॉन्टैक्स' या कुछ और? क्योंकि मुझे पूरा यकीन है कि यह किया गया - _ पर सिर्फ एक साइड-नोट है "यह हास्केल के साथ भी संभव है" _ बिट। –